gpt4 book ai didi

c - 如何将代码点 32 位整数数组(UTF-32?)转换为 Windows native 字符串?

转载 作者:行者123 更新时间:2023-11-30 15:21:55 25 4
gpt4 key购买 nike

如何将代码点 32 位整数数组 (UTF-32?) 转换为 Windows native 字符串?在 API 级别处理 Unicode 的 Windows native 字符串类型是什么?它能正确处理'u65535'之外的字符吗?

最佳答案

Windows 使用 UTF-16其 native 字符串类型。 UTF-16 可处理高达 U+10FFFF 的代码点,使用代理对U+FFFF 以上的代码点进行编码。

Windows 没有 UTF-32 的概念,所以你必须:

  1. 如果您使用的是 C++11 或更高版本,它具有 native std::u16stringstd::u32string 类型,以及 std::codecvt用于在 UTF-8、UTF-16 和 UTF-32 之间转换数据的类。

    #include <string>
    #include <locale>

    std::u16string Utf32ToUtf16(const u32string &codepoints)
    {
    std::wstring_convert<
    std::codecvt_utf16<char32_t, 0x10ffff, std::little_endian>
    char32_t> conv;
    std::string bytes = conv.to_bytes(codepoints);
    return std::u16string(reinterpret_cast<char16_t*>(bytes.c_str()), bytes.length() / sizeof(char16_t));
    }
  2. 如果您使用的是早期 C/C++ 版本,则必须手动从 UTF-32 转换为 UTF-16:

    // on Windows, wchar_t is 2 bytes, suitable for UTF-16
    std::wstring Utf32ToUtf16(const std::vector<uint32_t> &codepoints)
    {
    std::wstring result;
    int len = 0;

    for (std::vector<uint32_t>::iterator iter = codepoints.begin(); iter != codepoints.end(); ++iter)
    {
    uint32_t cp = *iter;
    if (cp < 0x10000) {
    ++len;
    }
    else if (cp <= 0x10FFFF) {
    len += 2;
    }
    else {
    // invalid code_point, do something !
    ++len;
    }
    }

    if (len > 0)
    {
    result.resize(len);
    len = 0;

    for (std::vector<uint32_t>::iterator iter = codepoints.begin(); iter != codepoints.end(); ++iter)
    {
    uint32_t cp = *iter;
    if (cp < 0x10000) {
    result[len++] = static_cast<wchar_t>(cp);
    }
    else if (cp <= 0x10FFFF) {
    cp -= 0x10000;
    result[len++] = static_cast<wchar_t>((cp >> 10) + 0xD800);
    result[len++] = static_cast<wchar_t>((cp & 0x3FF) + 0xDC00);
    }
    else {
    result[len++] = static_cast<wchar_t>(0xFFFD);
    }
    }
    }

    return result;
    }
  3. 使用第三方库,例如 libiconvICU .

关于c - 如何将代码点 32 位整数数组(UTF-32?)转换为 Windows native 字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29433124/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com