【发布时间】:2018-06-18 23:23:26
【问题描述】:
我正在尝试从控制台为我的 c++ 应用程序读取 UTF-8 编码的波兰字符。 我确定控制台使用此代码页(已签入属性)。 我已经尝试过的:
- 使用 cin - 而不是 "zażółć" 我读的是 "za\0\0\0\0"
- 使用 wcin - 而不是“zażółć” - 结果与使用 cin 相同
- 使用 scanf - 而不是 'zażółć\0' 我读的是 'za\0\0\0\0\0'
- 使用 wscanf - 结果与使用 scanf 相同
- 使用 getchar 逐一读取字符 - 结果与使用 scanf 相同
在 main 函数的开头我有以下几行:
setlocale(LC_ALL, "PL_pl.UTF-8");
SetConsoleOutputCP(CP_UTF8);
SetConsoleCP(CP_UTF8);
我将非常乐意提供帮助。
【问题讨论】:
-
你试试
ReadConsoleW吗? -
如果你能让它工作我会很惊讶,windows真的不使用utf-8,它更喜欢utf-16。
-
首先检查SetConsoleCP的返回值
-
代码页 65001 (UTF-8) 不适用于读取非 ASCII(7 位)字符,即使使用 Windows 10 中的新控制台也是如此。在旧版本中,整个调用仅返回读取的 0 个字符如果字符串中有 1 个非 ASCII 字符。在 Windows 10 中,它用 NUL 代替非 ASCII 字符。该错误在控制台主机进程中。 conhost.exe,它使用暂存缓冲区调用
WideCharToMultiByte,其大小适用于单字节或双字节代码页(取决于系统区域设置),但不是可变编码,例如 UTF-8。 -
只需运行
WCHAR cc[256]; ULONG n; ReadConsoleW(GetStdHandle(STD_INPUT_HANDLE), cc, RTL_NUMBER_OF(cc), &n, 0); MessageBoxW(0,cc,0,0);即可查看您阅读的内容
标签: c++ windows visual-c++ utf-8