Unicode字符串文字

rub*_*nvb 13 c++ unicode string-literals c++11 unicode-literals

C++ 11引入了一组新的字符串文字前缀(甚至允许用户定义的后缀).除此之外,您可以直接使用Unicode转义序列来编码某个符号,而无需担心编码.

const char16_t* s16 = u"\u00DA";
const char32_t* s32 = U"\u00DA";
Run Code Online (Sandbox Code Playgroud)

但是我可以在wchar_t字符串文字中使用unicode转义序列吗?如果不可能,这似乎是一个缺陷.

const wchar_t* sw = L"\u00DA";
Run Code Online (Sandbox Code Playgroud)

will的整数值sw[0]当然取决于wchar_t特定平台上的内容,但对于所有其他效果,这应该是可移植的,不是吗?

Ker*_* SB 10

它会工作,但它可能没有所需的语义.\u00DA将扩展为UTF8/16/32编码所需的尽可能多的目标字符,具体取决于大小wchar_t,但请记住,宽字符串没有任何记录的,保证编码语义 - 它们只是"系统的编码" ,没有试图说出那是什么,或要求用户知道那是什么.

所以最好不要混合搭配.使用两者中的任何一个,但不是两个:

  1. 系统特定的:char*/ "",wchar_t*/ L"",- \xliterals,mbstowcs/wcstombs

  2. Unicode:char*/ u8"",char16_t*/ u"",char32_t*/ U"",\u/ \Uliterals.

(以下是我在这个问题上的一些 相关 问题.)