2011-11-24 18 views
5

Ben bu kod basit çizgi ve en son clang ++clang ++ ve u16string

#include <stdio.h> 
#include <string> 

using std::u16string; 


int main (int argc, char** argv) 
{ 
    u16string s16 = u"鵝滿是快烙滴好耳痛"; 

    return EXIT_SUCCESS; 
} 


Ben-iMac:Desktop Ben$ clang++ -std=c++0x -stdlib=libc++ main.cpp -o main 
main.cpp:15:21: error: use of undeclared identifier 'u' 
    u16string s16 = u"鵝滿是快烙滴好耳痛" 
+1

Clang'ın yeni Unicode dizesi değişmezlerini desteklediğinden emin misiniz? –

cevap

5
: http://clang.llvm.org/docs/LanguageExtensions.html#cxx_unicode_literals

ve burada bir durum sayfasıEn son sürümü, c2v2.org ya da Apple'ın clang 3.0 sürümünden gelen clang, v2.9'un sürümlerini yayımladı, Unicode dize değişmezlerini desteklemiyor. Gövde kaynağının üstünden oluşturulan en son kullanılabilir sürümü, Unicode dizisi değişmezlerini desteklemektedir.

Clang'ın sonraki llvm.org sürümü (yani, 3.0) Unicode dizesi değişmez sözdizimini destekleyecektir, ancak ASCII'yi aşan herhangi bir kodlama kaynağı için destek içermez. Yani, bu llvm.org sürümü ile bile, bu karakterleri kaynağınızda tam anlamıyla yazamayacaksınız ve bunları UTF-16 kodlanmış bir dize değerine dönüştüreceksiniz. Bunun yerine, \ u kaçaklarını kullanmanız gerekir. Yine, gövdenin tepesi UTF-8 kaynak kodunu destekliyor, ancak şu anda test altında olan llvm.org 3.0 sürümü için zamanında devreye girmedi. Bundan sonraki sürüm (6 ay ya da daha sonra) UTF-8 kaynak kodu için daha iyi desteğe sahip olmalıdır (ancak diğer kaynak kodlamaları değil).

Düzenleme: Clang'ın Xcode 4.3 sürümü bu özelliklere sahiptir.

Düzenleme: Standart aslında çok destek gerektirmez

#include <string> 

int main() { 
    std::u16string a = u"鵝"; // UTF-8 source is transformed into UTF-16 literal 
    std::u32string b = U"滿"; // UTF-8 source is transformed into UTF-32 literal 
} 

Bu çıkıyor: Ve şimdi LLVM.org 3.1 sürüm tamamen aşağıdakileri destekler

Şimdi tınlamak onlara sahip iostreams kütüphanesinde char16_t ve char32_t için, bu yüzden bundan daha fazla faydalanmak için muhtemelen başka bir string tipine dönmeniz gerekecektir. En azından bu ve daha kullanışlı std :: string arasında dönüştürme yeteneği gereklidir (ayarlanması tam olarak uygun olmasa da ...).