从Mac OS Roman编码到UTF8?

时间:2012-09-27 20:55:41

标签: c++ c winapi character-encoding

我正在尝试将Mac OS Roman字符串转换为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中的字符串。我怎么知道temp中的字符串是UTF格式?

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

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分: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...
    }
}