c++ - Unicode 字符串文字

标签 c++ c++11 unicode string-literals unicode-literals

C++11 引入了一组新的字符串字面前缀(甚至允许用户定义后缀)。最重要的是,您可以直接使用 Unicode 转义序列对某个符号进行编码,而不必担心编码问题。

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

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

const wchar_t* sw = L"\u00DA";

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

最佳答案

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

所以最好不要混搭。使用两者之一,但不能同时使用两者:

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

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

(这里是我关于这个主题的 some related questions。)

关于c++ - Unicode 字符串文字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7636797/

相关文章:

c++ - 多线程队列原子操作

包含在 2 个特定字符之间的 C++ 子字符串

c++ - CPP std::thread 尝试使用已删除的函数

unicode - 使用awk去除字节顺序标记

c++ - 为什么 C++ 允许重复的 + 运算符,例如 x = 1++++++++ 2;

c++ - 如何为共享基类并在定义结构之后定义的结构定义复制构造函数

c++ - 常量 reference_wrapper

java - 使用 NetBeans IDE 开发的 Java 应用程序中不打印阿拉伯字符

c - c中的unicode字符串操作

c++ - 如何将 CS_DROPSHADOW 应用于 CDialog 的子类