直到2022年,微软还没有把Windows上的UTF-8字符处理弄明白。我尝试了以下操作,试图从通过 cin 直接读入 UTF-8 文本,均以失败告终,无论我用的是 Windows Terminal,还是经典的 conhost,还是 ConEmu、MobaXTerm:
system("chcp 65001");
SetConsoleCP
修改系统全局 Code Page 到 65001
结果不是中文全部变成“0”就是变成无效的字符。
这个 SO 回答给出了部分解决这个问题的方法——使用 Windows 的 ReadConsoleW API 直接读取 UTF-16 字符串并用 WideCharToMultiByte 转换为 UTF-8。(原 po 的函数调用没有带“W”,估计是假定了编译开了 UNICODE,我这里就显式指定了)。因此我们可以写出这样的代码:
unsigned read_console_utf8(char* out, int max_size)
{
auto wstr = new wchar_t[max_size];
unsigned read_len;
ReadConsole(GetStdHandle(STD_INPUT_HANDLE), wstr, max_size, &read_len, NULL);
int size = WideCharToMultiByte(CP_UTF8, 0, wstr, read_len, mb_str, max_size - 1, NULL, NULL);
mb_str[size] = 0;
delete[] wstr;
return size;
}
Comments | NOTHING