将unicode代码点转换为utf-16 在Windows上的C++中,如何转换表单和* xHHHH的XML字符引用;代码>到utf-16小端字符串

将unicode代码点转换为utf-16 在Windows上的C++中,如何转换表单和* xHHHH的XML字符引用;代码>到utf-16小端字符串,c++,windows,unicode,unicode-escapes,C++,Windows,Unicode,Unicode Escapes,我在想,如果hhhh部分是4个字符或更少,那么它是2个字节,适合一个utf-16字符。但是,这个和一些接近底部的是5位十六进制数,不能放入两个字节。如何将其转换为utf-16 我想知道这个功能是否能够完成这项工作 我对大于2字节的代码点如何转换为utf-16缺乏理解!(或者对于这个问题,我不太确定大于1字节的代码点是如何转换成utf-8的,但这是另一个问题) 谢谢。Unicode代码点(UTF-32)有4个字节宽,可以使用以下代码(我碰巧有这些代码)转换为UTF-16字符(以及可能的代理) 它没

我在想,如果hhhh部分是4个字符或更少,那么它是2个字节,适合一个utf-16字符。但是,这个和一些接近底部的是5位十六进制数,不能放入两个字节。如何将其转换为utf-16

我想知道这个功能是否能够完成这项工作

我对大于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;
}
/**
*将U-32代码点转换为UTF-16(和可选代理)
*@param utf32-UTF-32代码点
*@param utf16-返回UTF-16字符
*@return-UTF-16字符(1或2)中的数字代码单位。
*/
未签名的utf32到utf16(字符32到utf32,标准::数组和utf16)
{
如果(utf32<0xD800 | | |(utf32>0xDFFF&&utf32<0x10000))
{
utf16[0]=char16_t(utf32);
utf16[1]=0;
返回1;
}
utf32-=0x010000;
utf16[0]=字符16_t((0b1111'1111'1100'0000'0000&utf32)>>10)+0xD800);
utf16[1]=字符16_t(((0b0000'0000'0011'1111'1111&utf32)>>00)+0xDC00);
返回2;
}

MultiByteToWideChar
完全不适合此任务。相关:。将代码点转换为UTF-16的算法在Wikipedia上有描述,请参阅@RemyLebeau,但此问题中更大的问题是转换每个字符串
&#xhhh首先指向一个代码点。完成后,您的建议可能会有所帮助。@MarkRansom将XML字符引用解析为数字代码点值是很简单的。特别是如果你使用一个实际的XML解析器并让它为你工作,你可能会考虑专门处理0xD800到0xDFFF,因为那些可能是错误的输入。@ MalkSSOM是的,我想知道没有错误检查(我在很久以前写的)。但再看看维基百科的文章,它说,即使范围是技术上不好的代码点,很多软件允许他们无论如何。。。因此,我将不得不考虑一下这个问题。如果代码点配对以生成有效的UTF-16字符,那么它也可能不是格式错误的输入。JSON就是这样编码的,例如,参见。