【问题标题】:How can I use unicode \u003c in C++?如何在 C++ 中使用 unicode \u003c?
【发布时间】:2015-10-10 02:00:03
【问题描述】:

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

const static string strUnicode = "\u003c";

但是编译的时候出错了。

error: \u003c is not a valid universal character

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

【问题讨论】:

  • 如果我错了请纠正我,但这不只是"<"吗?
  • 对我来说它确实为我正确编译。我使用 gcc 编译器。你呢?
  • 但它确实失败了:ideone.com/L2wkMh
  • 在较新的编译器中试一试,这行得通:ideone.com/zcCuFU
  • GCC 4.1.2 于 2007 年 2 月发布,GCC 4.1.0 于 2006 年 2 月发布。这几乎肯定会在较新的版本中得到修复。

标签: c++ unicode


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    (根据interjay的评论编辑):

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

    用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 在此代码-sn-p 上给出了错误(是的,它一定是在预处理期间发生的,是的,它介于 #if 0 和 @987654327 之间@):

    #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; }
    

    结果:

    gcc (ver-5.4, -std=c11):     error: \u0020 is not a valid universal character
    gcc (ver-10.2, -std=c11):    error: \u0020 is not a valid universal character
    clang (ver-3.4.2, -std=c11): error: character ' ' cannot be specified by a universal character name
    

    【讨论】:

    • 您使用了错误的类型。 u"..." 文字给出了 char16_t 数组,而不是 int16_t。一旦我修复它,它在新旧版本的 GCC 和 clang 上都能很好地编译。不允许使用代理代码点,可能是因为它们本身不代表字符。
    • @interjay 遗憾的是,这并没有改变我的情况;我添加了一个最小示例并添加了一些具体结果。
    • 你正在编译为 C。问题是关于 C++。
    • @interjay 没错,这取决于语言。我会相应地编辑答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-19
    • 1970-01-01
    • 2014-07-10
    • 2011-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多