如何在C ++中使用unicode \ u003c?

时间:2015-10-10 02:00:03

标签: c++ unicode

我想在这样的C ++中使用unicode \ u003c。

const static string strUnicode = "\u003c";

但编译时遇到错误。

error: \u003c is not a valid universal character

我发现\ u0001和\ u009f之间的unicode字符会导致相同的编译错误。这是一个错误吗?如何正确使用C ++中的这些unicode字符?

2 个答案:

答案 0 :(得分:4)

在 C++11 之前,C++ 不允许代码点低于 0xA0 的 Unicode 转义,除了 0x24 ($)、0x40 (@) 和 0x60 (`)。

在 C++11 中,这个限制被取消,它允许整个 UCS 范围(0x0-0x10FFFF),除了代理代码点(0xD800-0xDFFF)。

C 仍然具有与 C++98 相同的限制。

参考:https://en.cppreference.com/w/cpp/language/escape(请参阅“通用字符名称范围”部分)。

答案 1 :(得分:0)

(根据 interjay 的评论编辑):

如果使用的编译器和使用的标准(例如 -std=c++11g++)足够新,它应该可以使用 C++。

用C,没有办法,就注定了;)

例如,如果我想在 UTF16 格式的代码中插入一些俄语文本(根据平台将是 UTF-16LE 或 UTF-16BE),我不能这样写:

uint16_t ustr[]= u"\u043f\u0435\u0434\u0438\u0438\u0020\u2014\u0020";

相反:

uint16_t ustr[]= {0x043f,0x0435,0x0434,0x0438,0x0438,0x0020,0x2014,0x0020,0};

代理对也不起作用:

uint16_t usp[] = u"\ud83c\udf54"; /* surrogate pair */

编辑:可能很难相信,但是 gcc-5.4 在这个代码片段上给出了错误(是的,它一定是在预处理期间发生的,是的,它介于 #if 0 和 {{ 1}}):

#endif

编辑:重现问题的最简单程序:

#if 0
Some \u sequences give errors like these:
error: \u0020 is not a valid universal character
error: \ud83c is not a valid universal character
error: \udf54 is not a valid universal character
#endif

结果:

int main (void) { u"\u0020"; return 0; }