前几天在开发程序时,我不得不将 ASCII 字符串转换为 Unicode 字符串。顺便说一句,我正在使用 Visual Studio 2012 在 Windows 上工作。我注意到 Win32 函数有一些我无法解决的奇怪行为MultiByteToWideChar
。我写了一些测试代码,如下:
int main()
{
/* Create const test string */
char str[] = "test string";
/* Create empty wchar_t buffer to hold Unicode form of above string, and initialize (zero) it */
wchar_t *buffer = (wchar_t*) LocalAlloc(LMEM_ZEROINIT, sizeof(wchar_t) * strlen(str));
/* Convert str to Unicode and store in buffer */
int result = MultiByteToWideChar(CP_UTF8, NULL, str, strlen(str), buffer, strlen(str));
if (result == 0)
printf("GetLastError result: %d\n", GetLastError());
/* Print MultiByteToWideChar result, str's length, and buffer's length */
printf_s(
"MultiByteToWideChar result: %d\n"
"'str' length: %d\n"
"'buffer' length: %d\n",
result, strlen(str), wcslen(buffer));
/* Create a message box to display the Unicode string */
MessageBoxW(NULL, buffer, L"'buffer' contents", MB_OK);
/* Also write buffer to file, raw */
FILE *stream = NULL;
fopen_s(&stream, "c:\\test.dat", "wb");
fwrite(buffer, sizeof(wchar_t), wcslen(buffer), stream);
fclose(stream);
return 0;
}
正如你所看到的,它只需要一个普通的字符串,创建一个缓冲区来存储 Unicode 字符串,将转换后的 Unicode 字符串放入缓冲区,并显示一些结果,还将缓冲区写入文件。
输出:
MultiByteToWideChar result: 11
'str' length: 11
'buffer' length: 16
已经很奇怪了。该函数正在处理 C 字符串中正确数量的字符,但wcslen
报告输出缓冲区比 C 字符串长!我很确定我也正确分配了缓冲区。
我尝试过使用不同大小的字符串长度,但最后总是有垃圾,并且wcslen
总是报告缓冲区的长度是 4 的倍数。
最后,对于这个特定的字符串 ( "test string"
),这是打印到文件的原始缓冲区:
74 00 65 00 73 00 74 00 20 00 73 00 74 00 72 00 t.e.s.t. .s.t.r.
69 00 6E 00 67 00 AB AB AB AB AB AB AB AB EE FE i.n.g...........
(即 32 个字节或 16 个 Unicode 字符。)
末尾的 10 个字节为 5 个字符;四个U+ABAB和一个U+FEEE,这对我来说毫无意义。
每次我尝试转换字符串时,它们都会以不同的数量出现。
我有点没主意了。任何人?
提前致谢!