2011-10-03 130 views
12

C++ 11引入了一組新的字符串文字前綴(甚至允許用戶定義的後綴)。最重要的是,您可以直接使用Unicode轉義序列來編碼某個符號,而不必擔心編碼。Unicode字符串文字

const char16_t* s16 = u"\u00DA"; 
const char32_t* s32 = U"\u00DA"; 

但我可以使用Unicode轉義序列wchar_t字符串文字呢?如果這不可能,這似乎是一個缺陷。

const wchar_t* sw = L"\u00DA"; 

sw[0]整數值當然會依靠什麼wchar_t是在特定平臺上,但所有其他的效果,這應該是便攜式的,不是嗎?

+0

相信SW的'值[0]'取決於什麼'wchar_t'是在特定平臺上只的程度'wchar_t'的大小是多少。即'\ u00DA'應該總是會導致U + 00DA的一些Unicode編碼(UTF-8,UTF-16,UTF-32),即使這不是該類型的平臺的正常編碼。 – bames53

+1

其實以上是不正確的。實現應該將通用字符名稱視爲文字字符。因此,如果實現將字符串文字中的字符轉換爲執行字符集,那麼它也應該使用UCN執行此操作。如果UCN位於unicode字面內(例如,u8「\ u00DA」),則只保證UTF編碼。 – bames53

回答

8

它會工作,但它可能沒有所需的語義。 \u00DA將擴展爲UTF8/16/32編碼所需的儘可能多的目標字符,具體取決於wchar_t的大小,但請記住,寬字符串沒有任何記錄的,有保證的編碼語義 - 它們只是「系統的編碼「,沒有試圖說出那是什麼,或者要求用戶知道10是什麼。

所以最好不要混合搭配。使用其中之一,但不能兩者之二:

  1. 系統專用:char*/""wchar_t*/L""\x -literals,mbstowcs/wcstombs

  2. 的Unicode:char*/u8""char16_t*/u"",char32_t*/U"",\u/\U文字。

(這裏是somerelated關於這個問題的礦井questions。)

+0

關於這個問題的背景的完整細節,[this libC++ test](http://llvm.org/svn/llvm-project/libcxx/trunk/test/localization/locale.categories/category.ctype/locale .ctype.byname/is_1.pass.cpp)在Windows \'x00DA'行失敗。我想知道是否可以用'\ u00DA'代替它,並且它適用於所有足夠大(即16位或32位)的'wchar_t', – rubenvb