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