WideCharToMultiByte - 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。

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

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

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

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

最新更新