2011-11-24 66 views
5

我有一個時間地獄的代碼這個簡單的線條和最新鐺++鐺++和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支持新的Unicode字符串文字嗎? –

回答

5

最新版發佈來自llvm.org或Apple's clang 3.0的clang版本v2.9不支持Unicode字符串文字。最新的可用版本,從樹幹源碼頂部構建,確實支持Unicode字符串文字。

clang的下一個llvm.org版本(即3.0)將支持Unicode字符串文字語法,但不支持超出ASCII的任何源文件編碼。因此,即使在llvm.org發行版中,您也無法在源文件中直接輸入這些字符,並將它們轉換爲UTF-16編碼的字符串值。相反,你必須使用\ u轉義符。同樣,trunk的最高端確實支持UTF-8源代碼,但是它並沒有及時爲當前正在測試的llvm.org 3.0版本發佈。之後的下一個版本(在6個月左右)應該對UTF-8源代碼有更好的支持(但不包括其他源代碼)。

編輯:clang的Xcode 4.3版本具有這些功能。

編輯:現在從LLVM.org的3.1版本有他們

所以現在鐺完全支持以下功能:

#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 
} 

原來的標準實際上並不需要太多的支持對於iostreams庫中的char16_t和char32_t,所以您可能必須轉換爲另一種字符串類型才能獲得更多用途。至少需要在這些和更有用的std :: string之間進行轉換的能力(儘管設置起來不太方便)。