WideCharToMultiByte - 所需的大小和写入的字节对于Shift-JIS代码页是不同的

时间:2016-05-19 10:34:04

标签: c++ windows winapi codepages shift-jis

我有一个包含四个日文字符的Unicode字符串,并且我使用WideCharToMultiByte将其转换为指定Shift-JIS代码页为932的多字节字符串。为了获得大小所需的缓冲区我首先调用WideCharToMultiByte,并将cbMultiByte参数设置为0.这将按预期返回9,但是当我实际再次调用WideCharToMultiByte进行转换时,它返回写入的字节数为13下面是一个例子,我目前正在将我的缓冲区大小编码为100:

BSTR value = SysAllocString(L"日経先物");
char *buffer = new char[100];

int sizeRequired = WideCharToMultiByte(932, 0, value, -1, NULL, 0, NULL, NULL);

// sizeRequired is 9 as expected

int bytesWritten = WideCharToMultiByte(932, 0, value, sizeRequired, buffer, 100, NULL, NULL);

// bytesWritten is 13

buffer [8]包含字符串终结符\ 0,如预期的那样。 buffer [9-12]包含字节63。

因此,如果我将缓冲区的大小设置为sizeRequired,则它太小而第二次调用WideCharToMultiByte失败。有谁知道为什么要写一个额外的4个字节,每个字节的字节值为63?

1 个答案:

答案 0 :(得分:4)

您在第二次调用中将错误的参数传递给WideCharToMultiByte(目标所需的大小为源的长度)。你需要改变

int bytesWritten = WideCharToMultiByte(932, 0, value, sizeRequired, buffer, 100,
                                       NULL, NULL);

int bytesWritten = WideCharToMultiByte(932, 0, value, -1, buffer, sizeRequired,
                                       NULL, NULL);