最近我需要从用户那里读取非 ASCII 字符。我怀疑这在处理文件时相对容易,但我对此并不满意。我想同时支持文件输入和标准输入。这就是问题所在。
首先,我使用的是Windows,我也知道从控制台读取是平台相关的,因为Windows使用UTF-16而UNIX使用UTF-8,但我认为如果我转向UNIX,可能会出现同样的问题。所以,这是我用来捕获宽控制台输入的代码片段:
#include <iostream>
#include <string>
#include <locale>
template<class T> toBytes(T obj) { ... }
int main() {
std::setlocale(LC_ALL, "en_US");
std::wstring ws;
std::getline(std::wcin, ws);
for (auto c : ws) {
std::wcout << toBytes(c) << L' ' << L'(' << (int)c << L", \'" << c << L"\')";
}
}
但是......这并没有真正解决问题,这是输出:
对于某些字符,它可以将它们转换为 ASCII:
所以,请帮忙😄
我想我找到了问题的答案。实际上,winapi 中有一个函数(确切地说是“io.h”和“fcntl.h”)用于更改文件描述符的编码。因此,在主函数的开头放置以下两行将会有所帮助:
_setmode(_fileno(stdin), _O_U16TEXT);
_setmode(_fileno(stdout), _O_U16TEXT);
但是有一个警告,代理对似乎根本无法在控制台中工作,它们已正确编码,但不幸的是没有显示。