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

时间:2009-06-05 11:48:20

标签: visual-c++ unicode

我正在尝试单独使用Windows API将UTF-32文本转换为任何代码页。我无法使用CLR来完成这项任务。

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

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

如果代码点低于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;
}

答案 2 :(得分:0)

您可以在Windows中使用iconv库。它完全支持UTF-32(大端和小端)。