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

WideCharToMultiByte - required size and bytes written are different for Shift-JIS codepage

我有一个包含四个日文字符的 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?

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

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

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