2011-10-03 120 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