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

Visual c++ 是否可以仅使用Windows API将UTF32文本转换为UTF16?,visual-c++,unicode,Visual C++,Unicode,我试图发现,仅使用Windows API就可以将UTF-32文本转换为任何代码页。我无法使用CLR来执行此任务 Microsoft at的“代码页标识符”页面将UTF-32列为仅对托管应用程序可用 当使用UTF-32时,ConvertStringTo/FromUnicode失败。有了一点Unicode知识,您应该能够在不使用任何API的情况下创建UTF32到UTF16转换器 U+0000到U+FFFF范围内的所有字符都可以简单地删除上面的16位 U+10000到U+10FFFF范围内的值可以转换

我试图发现,仅使用Windows API就可以将UTF-32文本转换为任何代码页。我无法使用CLR来执行此任务

Microsoft at的“代码页标识符”页面将UTF-32列为仅对托管应用程序可用


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

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

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

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


您可以在Windows中使用iconv库。它完全支持UTF-32 big和little-endian。

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

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

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

代码如下:

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;
}

答案是,如果您不能使用windowapi进行此操作。你需要自己做。这里有一个unicode的测试代码链接:他们现在在FAQ中提到了这一点。我不想为此使用任何外部库。另一个库是libICUThis,您必须编写自己的代码才能在UTF-16和UTF-32之间进行转换。手动操作并不困难。