繁体   English   中英

从Mac OS Roman编码到UTF8?

[英]Encoding from Mac OS Roman to UTF8?

我正在尝试将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字符串。 我怎么知道temp中的字符串在UTF中?

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

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

您可以像使用MultiByteToWideChar一样获得所需的缓冲区大小,将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...
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM