代码之家  ›  专栏  ›  技术社区  ›  user3443063

如何将unicode数字转换为std::wstring?

  •  2
  • user3443063  · 技术社区  · 11 月前

    有没有一种简单的方法可以将Unicode数字转换为 std::wstring ? 例如,我想将U+1E9E(=16785054)转换为 ẞ

    1 回复  |  直到 11 月前
        1
  •  4
  •   Remy Lebeau    11 月前

    的编码取决于您运行代码的平台 std::wstring 需要是UTF-16(即Windows)或UTF-32(即大多数其他操作系统)。将代码点号转换为这两种格式中的任何一种都非常简单。

    在平台上 wchar_t 大小为32位,适用于UTF-32,您可以按原样将数字强制转换为 wchar_t 然后将其分配给您的 wstring

    在平台上 wchar_t 大小为16位,适用于UTF-16,您必须使用一点数学运算将数字转换为1或2 wchar_t s基于其值,然后将结果分配给 wstring

    例如:

    std::wstring CodePointToWString(unsigned int codepoint)
    {
        std::wstring str;
    
        if constexpr (sizeof(wchar_t) > 2) {
            // use UTF-32
            str = static_cast<wchar_t>(codepoint);
        }
        else {
            // use UTF-16
            if (codepoint <= 0xFFFF) {
                str = static_cast<wchar_t>(codepoint);
            }
            else {
                codepoint -= 0x10000;
                str.resize(2);
                str[0] = static_cast<wchar_t>(0xD800 + ((codepoint >> 10) & 0x3FF));
                str[1] = static_cast<wchar_t>(0xDC00 + (codepoint & 0x3FF));
            }
        }
    
        return str;
    }
    
    ...
    
    std::wstring str = CodePointToWString(0x1E9E);
    

    仅供参考,U+1E9E不是16785054,而是7838。16785054将改为U+1001E9E,这不是有效的代码点。