【问题标题】:Using unicode character in character literal在字符文字中使用 unicode 字符
【发布时间】:2023-03-27 15:29:01
【问题描述】:

我们知道像'═' 这样的东西会给出一个多字符常量警告。另一种方法是使用 0x2550 或 "\u2550"。但是,后者需要打印功能支持\u 转义序列。但是我不想到处使用十六进制。有没有一种我可以使用的语言结构,当我真正的意思是uint32_t c = 0x2550,即'='u时,我可以写'='

【问题讨论】:

    标签: c++ c++11 unicode


    【解决方案1】:

    我们知道像'═'这样的东西会给出一个多字符常量警告。

    没有。

    替代方法是使用 0x2550 或“\u2550”。

    没有。

    但是后者需要打印函数支持\u转义序列。

    没有。

    但是我不想到处使用十六进制。当我真正的意思是 uint32_t c = 0x2550,即 '═'u 时,是否有我可以使用的语言结构允许我写 '═'。

    是的。

    uint32_t c = L'═';
    

    使用支持该字符的源编码。

    但对于不在 Unicode 基本多语言平面中的字符,它会涉及更多,因为 Windows 中的 wchar_t 与原始 Unicode 一样只有 16 位。

    【讨论】:

    • L 前缀使用wchar_t 生成一个字面量,因为它在不同平台上的大小不同,所以移植性不太好。在 C++11 中,如果您需要以可移植的数字形式存储字符,最好使用 char16_t c = u'═';char32_t c = U'═';
    • @RemyLebeau:可移植性,visual c++ 尚不支持u 前缀。便携怎么样,你觉得呢?哈哈:)
    • 无论如何,wchar_t 对于答案中提到的限制(即 BMP)非常便携。例如这就是为什么许多大型便携式 GUI 框架将字符串文字转换为宽字符串的原因。所以你的两个假设都是错误的:与你的假设相反,wchar_t 不是很便携,它是,与你的假设相反,C++11 u 前缀非常便携,它根本不是便携的。还没有。
    【解决方案2】:

    \u 序列由 C++ 编译器解释,而不是由“打印函数”解释。但是,您需要使用宽字符串 (std::wstring) 来存储字符。例如:

    #include <iostream>
    #include <string>
    
    int main() {
        std::wstring s(L"\u2550");
    
        std::wcout << s.size() << std::endl
                   << std::hex << static_cast<int>(s[0]) << std::dec << std::endl
                   << s << std::endl;
    
        return 0;
    }
    

    输出显示这个字符串只有一个字符。

    【讨论】:

      猜你喜欢
      • 2014-08-23
      • 2013-06-21
      • 2011-11-30
      • 1970-01-01
      • 1970-01-01
      • 2017-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多