繁体   English   中英

将 unicode 代码点转换为 utf-16

[英]Convert unicode codepoint to utf-16

在 Windows 上的 C++ 中,如何转换&#xhhhh; 到 utf-16 little endian 字符串?

我在想如果 hhhh 部分是 4 个字符或更少,那么它是 2 个字节,适合一个 utf-16 字符。 但是,这个wiki 页面有一个字符引用表,底部附近的一些是 5 位十六进制数字,不适合两个字节。 它们如何转换为 utf-16?

我想知道MultiByteToWideChar function 是否能够胜任这项工作。

我对大于 2 字节的代码点如何转换为 utf-16 的理解不足,(或者就此而言,我不太确定大于 1 字节的代码点如何转换为 utf-8。但这是另一个问题)。

谢谢。

Unicode 代码点 (UTF-32) 有 4 个字节宽,可以使用以下代码(我碰巧在附近)转换为UTF-16字符(和可能的代理)。

它没有经过大量测试,因此感激地接受错误报告:

/**
 * Converts U-32 code point to UTF-16 (and optional surrogate)
 * @param utf32 - UTF-32 code point
 * @param utf16 - returned UTF-16 character
 * @return - The number code units in the UTF-16 char (1 or 2).
 */
unsigned utf32_to_utf16(char32_t utf32, std::array<char16_t, 2>& utf16)
{
    if(utf32 < 0xD800 || (utf32 > 0xDFFF && utf32 < 0x10000))
    {
        utf16[0] = char16_t(utf32);
        utf16[1] = 0;
        return 1;
    }

    utf32 -= 0x010000;

    utf16[0] = char16_t(((0b1111'1111'1100'0000'0000 & utf32) >> 10) + 0xD800);
    utf16[1] = char16_t(((0b0000'0000'0011'1111'1111 & utf32) >> 00) + 0xDC00);

    return 2;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM