从 std::wcin 检索有效的系统编码字符串

问题描述 投票:0回答:1

最近我需要从用户那里读取非 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:

所以,请帮忙😄

c++ io character-encoding console-application
1个回答
0
投票

我想我找到了问题的答案。实际上,winapi 中有一个函数(确切地说是“io.h”和“fcntl.h”)用于更改文件描述符的编码。因此,在主函数的开头放置以下两行将会有所帮助:

_setmode(_fileno(stdin), _O_U16TEXT);
_setmode(_fileno(stdout), _O_U16TEXT);

但是有一个警告,代理对似乎根本无法在控制台中工作,它们已正确编码,但不幸的是没有显示。

© www.soinside.com 2019 - 2024. All rights reserved.