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