0

我正在尝试将Mac OS 罗马字符串转换为 UTF8 字符串:

MacRoman: OneBW/1 Schwarzwei§:

我正在使用这些调用:

nBufLen = MultiByteToWideChar(CP_MACCP, 0, macRomanString.c_str(), -1, NULL, 0);

MultiByteToWideChar(CP_MACCP, 0, macRomanString.c_str(), -1, tempWchar, nBufLen);

在此刻:

tempWhar = OneBW/1 Schwarzweiß:

现在我打这个电话:

WideCharToMultiByte(CP_UTF8, 0, tempWchar, -1, temp, nBufLen, NULL, NULL);

我期望temp使用 UTF 8,但我得到了返回值0,这是不成功的翻译,一些字符串在temp. 我怎么知道 string intemp是 UTF 格式?

我是以正确的方式做的还是缺少了什么?谢谢。

4

2 回答 2

1

WideCharToMultiByte将从输入中获取单个宽字符并将它们转换为输出中的多个字符。因此,在大多数情况下,输出将大于输入。您传递的缓冲区大小与从中获得的缓冲区大小相同,MultiByteToWideChar因此缓冲区自然太小了。

您可以使用与 相同的方式获取所需MultiByteToWideChar的缓冲区大小,为缓冲区大小传递 0 并使用返回的值。

当函数失败时,您在字符串末尾看到垃圾的原因是缓冲区没有空间容纳必要的终止空字符。打印字符串超出缓冲区的末尾。

于 2012-09-27T21:48:11.693 回答
0

正如其他人所说,您的输出缓冲区太小。尝试这样的事情:

int nBufLen = MultiByteToWideChar(CP_MACCP, 0, macRomanString.c_str(), macRomanString.length(), NULL, 0); 
if (nBufLen != 0)
{ 
    std::vector<WCHAR> tempWchar(nBufLen, 0);
    MultiByteToWideChar(CP_MACCP, 0, macRomanString.c_str(), macRomanString.length(), &tempWchar[0], nBufLen); 

    nBufLen = WideCharToMultiByte(CP_UTF8, 0, &tempWchar[0], tempWchar.size(), NULL, 0, NULL, NULL);
    if (nBufLen != 0)
    {
        std::vector<CHAR> tempUchar(nBufLen, 0);
        WideCharToMultiByte(CP_UTF8, 0, &tempWchar[0], tempWchar.size(), &tempUchar[0], nBufLen, NULL, NULL);

        // use tempUChar as needed...
    }
}
于 2012-09-27T22:06:07.580 回答