是否可以仅使用 Windows API 将 UTF32 文本转换为 UTF16?

6 unicode visual-c++

我试图找到单独使用 Windows API 可以将 UTF-32 文本与任何代码页相互转换。我无法使用 CLR 来完成此任务。

Microsoft 的代码页标识符页面 ( http://msdn.microsoft.com/en-us/library/dd317756(VS.85).aspx ) 将 UTF-32 列为仅可用于托管应用程序。

使用 UTF-32 时 ConvertStringTo/FromUnicode 失败。

Anu*_*rma 6

您可以使用此函数,将要转换为等效 UTF-16 代码点(单个或代理项,视情况而定)的 UTF-32 代码点作为第一个参数,将高代理项和低代理项作为第二个和第三个参数。通过引用返回高代理值和低代理值。

如果代码点低于 0x10000,那么我们只需通过引用返回低代理项中的代码点,而高代理项为 0。

如果代码点大于 0x10000,那么我们使用此维基百科页面上给出的规则来计算高代理项对和低代理项对:

https://en.wikipedia.org/wiki/UTF-16#Example_UTF-16_encoding_procedure

这是代码:

unsigned int convertUTF32ToUTF16(unsigned int cUTF32, unsigned int &h, unsigned int &l)
{
    if (cUTF32 < 0x10000)
    {
        h = 0;
        l = cUTF32;
        return cUTF32;
    }
    unsigned int t = cUTF32 - 0x10000;
    h = (((t<<12)>>22) + 0xD800);
    l = (((t<<22)>>22) + 0xDC00);
    unsigned int ret = ((h<<16) | ( l & 0x0000FFFF));
    return ret;
}
Run Code Online (Sandbox Code Playgroud)


Kev*_*man 1

有了一点 Unicode 的知识,您应该能够在不使用任何 API 的情况下创建 UTF32 到 UTF16 转换器。

U+0000 到 U+FFFF 范围内的所有字符都可以简单地删除高 16 位。

U+10000 到 U+10FFFF 范围内的值可以转换为两个 16 位字,称为代理对:

http://en.wikipedia.org/wiki/UTF-16#Encoding_of_characters_outside_the_BMP