Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用WriteFile将UTF-8字符写入标准输出时出现的问题_C_Visual C++_File Io_Utf 8_Stdout - Fatal编程技术网

C 使用WriteFile将UTF-8字符写入标准输出时出现的问题

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

我打算使用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 = (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);