C 使用WriteFile将UTF-8字符写入标准输出时出现的问题
我打算使用WriteFile方法编写字符串,如C 使用WriteFile将UTF-8字符写入标准输出时出现的问题,c,visual-c++,file-io,utf-8,stdout,C,Visual C++,File Io,Utf 8,Stdout,我打算使用WriteFile方法编写字符串,如ñaäïüwiç(utf-8编码)。 因此,我有以下代码: #include <windows.h> #include <fcntl.h> #include <io.h> #include <stdio.h> int main(void) { WCHAR str[] = L"ñaäïüwiç \n"; DWORD dwRead, dwWritten; dwRead = (wcs
ñaäïüwiç
(utf-8编码)。
因此,我有以下代码:
#include <windows.h>
#include <fcntl.h>
#include <io.h>
#include <stdio.h>
int main(void) {
WCHAR str[] = L"ñaäïüwiç \n";
DWORD dwRead, dwWritten;
dwRead = (wcslen(str) + 1) * sizeof(WCHAR);
HANDLE hParentStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
BOOL bSuccess = WriteFile(hParentStdOut, str, dwRead, &dwWritten, NULL);
return 0;
}
如何解决此问题?看起来您的字节被解释为ASCII。UTF-16中的字符ñ的十六进制编码为0x00F1。0xF1对应于ASCII代码页437中的±。打印的其他字符也是如此。看起来,使用UTF-16文本定义的字节没有丢失,而是被流解释为单个ASCII字节0xF1 0x00等 请参阅此处的相关帖子: 那篇帖子说你应该使用
WriteConsoleW
。该函数的参数与WriteFile
的参数相同,只是str
应为UTF-16:
DWORD dwToWrite, dwWritten;
dwToWrite = wcslen(str);
HANDLE hParentStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
BOOL bSuccess = WriteConsoleW(hParentStdOut, str, dwToWrite, &dwWritten, NULL);
您使用的
WCHAR
和L“ñaäïèwiç\n”
似乎表明您正在使用UTF-16,因此您可能正在将UTF-16写入UTF-8(或ASCII)输出流。我想这可以解释这些有趣的角色和他们之间的差距。我也不知道你的编辑器是否能处理给定的字符。FWIW,ñ
是Unicode中的U+00F1(因此在UTF-16中),0xF1是代码页437中的±
。因此,在代码页437 ASCII中,0x00F1也可能被解释为字节0xF1 0x00,因此出现了“间隙”;我没有注意到他作品中的空白。
DWORD dwToWrite, dwWritten;
dwToWrite = wcslen(str);
HANDLE hParentStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
BOOL bSuccess = WriteConsoleW(hParentStdOut, str, dwToWrite, &dwWritten, NULL);