0

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

4

1 回答 1

4

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

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

int bytesWritten = WideCharToMultiByte(932, 0, value, -1, buffer, sizeRequired,
                                       NULL, NULL);
于 2016-05-19T10:52:10.253 回答