如何在 C++ 输入中允许中文字符?

How can I allow Chinese characters in C++ input?

提问人:KRESHANK 提问时间:4/20/2022 更新时间:4/20/2022 访问量:761

问:

我一直在尝试通过Visual Studio 2019中的中文(简体)输入。当我输入一个英文单词时,它工作正常。为了确保控制台正确打印,我将控制台字体更改为与汉字兼容的字体。到目前为止,打印字符似乎还不是什么大问题,但是输入字符给我带来了一些麻烦。iostream

我尝试了在其他帖子中找到的几个“修复程序”,例如 or 或 ,以及这些函数的变体。在尝试调试时,我发现 ;我输入的字符被完全忽略了。setlocale(LC_ALL, "zh_CN.UTF-8")wcin.imbue(locale("zh_CN.UTF-8"))SetConsoleCP(UTF8)b = L""

但是,当我从文件中读取输入时,它似乎正在运行;我可以正确地解析、操作和打印文件。

void prepare() {
    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);

    // Change font to something compatible with chinese
    CONSOLE_FONT_INFOEX fontInfo;
    fontInfo.cbSize = sizeof(fontInfo);
    fontInfo.FontFamily = 54;
    fontInfo.FontWeight = 300;
    fontInfo.nFont = 0;
    const wchar_t myFont[] = L"KaiTi";
    fontInfo.dwFontSize = { 9, 30 };
    copy(myFont, myFont + (sizeof(myFont) / sizeof(wchar_t)), fontInfo.FaceName);

    SetCurrentConsoleFontEx(hConsole, false, &fontInfo);

    setlocale(LC_ALL, "zh_CN.UTF-8");

    //wcin.imbue(locale("zh_CN.UTF-8"));
    //wcout.imbue(locale("zh_CN.UTF-8"));
}

简化示例代码:

#define _UNICODE

int main() {
    prepare(); // Prepare console to output Chinese characters properly

    wcin.imbue(locale("zh_CN.UTF-8"));
    wcout.imbue(locale("zh_CN.UTF-8"));

    wstring a = L"你好";
    wcout << a; // Prints and displays properly

    wstring b;
    wcin >> b; // "你好"
    wcout << b; // Nothing prints

    return 0;
}

如何解决此问题?谢谢!

C 可视化-C++ IOstream CJK

评论

0赞 cup 4/20/2022
如果您的设置使用的是 utf-8,您知道输入是 unicode、DBCS 还是 MBCS 吗?您从哪种控制台运行它?控制台上的字符集是否已修改为使用 KaiTi 字体显示中文?
0赞 KRESHANK 4/20/2022
@cup我想我将输入设置为 Unicode,并且我从 Visual Studio 2019 的默认控制台输出运行它。控制台已修改为使用 KaiTi 字体显示中文;如果我有 unicode 或字符,我可以在控制台中打印它。除了英文字符之外,我无法正确输入任何内容。
0赞 cup 4/20/2022
你试过中文/日文的ime吗?learn.microsoft.com/en-us/windows/win32/dxtecharts/......
0赞 KRESHANK 4/20/2022
我有。我可以在控制台中输入中文,只是在我阅读时,存储了错误的值(更确切地说,根本没有值)。然而,这仅适用于 CJK 角色。wcin >> b
0赞 cup 4/20/2022
可能读入为前导 00 的 MBCS。在调试器中停止并检查您在 b 中获取的数据。

答: 暂无答案