我怎样才能 cin 和 cout 一些 unicode 文本?

新手上路,请多包涵

我问一个代码片段,它 cin 一个 unicode 文本,将另一个 unicode 连接到第一个 unicode 文本和 cout 结果。

PS 这段代码将帮助我解决另一个更大的 unicode 问题。但在此之前,关键是完成我所要求的。

添加:顺便说一句,当我运行可执行文件时,我无法在命令行中写入任何 unicode 符号。我应该怎么做?

原文由 Narek 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

这是一个显示四种不同方法的示例,其中只有第三种(C conio )和第四种(本机 Windows API)有效(但前提是不重定向标准输入/标准输出)。请注意,您仍然需要包含要显示的字符的字体(Lucida Console 至少支持希腊语和西里尔语)。请注意,这里的所有内容都是完全不可移植的,只是没有可移植的方式在终端上输入/输出 Unicode 字符串。

 #ifndef UNICODE
#define UNICODE
#endif

#ifndef _UNICODE
#define _UNICODE
#endif

#define STRICT
#define NOMINMAX
#define WIN32_LEAN_AND_MEAN

#include <iostream>
#include <string>
#include <cstdlib>
#include <cstdio>

#include <conio.h>
#include <windows.h>

void testIostream();
void testStdio();
void testConio();
void testWindows();

int wmain() {
    testIostream();
    testStdio();
    testConio();
    testWindows();
    std::system("pause");
}

void testIostream() {
    std::wstring first, second;
    std::getline(std::wcin, first);
    if (!std::wcin.good()) return;
    std::getline(std::wcin, second);
    if (!std::wcin.good()) return;
    std::wcout << first << second << std::endl;
}

void testStdio() {
    wchar_t buffer[0x1000];
    if (!_getws_s(buffer)) return;
    const std::wstring first = buffer;
    if (!_getws_s(buffer)) return;
    const std::wstring second = buffer;
    const std::wstring result = first + second;
    _putws(result.c_str());
}

void testConio() {
    wchar_t buffer[0x1000];
    std::size_t numRead = 0;
    if (_cgetws_s(buffer, &numRead)) return;
    const std::wstring first(buffer, numRead);
    if (_cgetws_s(buffer, &numRead)) return;
    const std::wstring second(buffer, numRead);
    const std::wstring result = first + second + L'\n';
    _cputws(result.c_str());
}

void testWindows() {
    const HANDLE stdIn = GetStdHandle(STD_INPUT_HANDLE);
    WCHAR buffer[0x1000];
    DWORD numRead = 0;
    if (!ReadConsoleW(stdIn, buffer, sizeof buffer, &numRead, NULL)) return;
    const std::wstring first(buffer, numRead - 2);
    if (!ReadConsoleW(stdIn, buffer, sizeof buffer, &numRead, NULL)) return;
    const std::wstring second(buffer, numRead);
    const std::wstring result = first + second;
    const HANDLE stdOut = GetStdHandle(STD_OUTPUT_HANDLE);
    DWORD numWritten = 0;
    WriteConsoleW(stdOut, result.c_str(), result.size(), &numWritten, NULL);
}

  • 编辑 1 :我添加了一个基于 conio 的方法。
  • 编辑 2 :我已经搞砸了 _O_U16TEXT 有点像 Michael Kaplan 的博客中描述的那样,但似乎只有 wgets 解释来自 ReadFile 的(8 位)数据 --- 作为 UTF-16。我会在周末对此进行进一步调查。

原文由 Philipp 发布,翻译遵循 CC BY-SA 2.5 许可协议

我过去也遇到过类似的问题,在我的情况下 imbuesync_with_stdio 成功了。尝试这个:

 #include <iostream>
#include <locale>
#include <string>

using namespace std;

int main() {
    ios_base::sync_with_stdio(false);
    wcin.imbue(locale("en_US.UTF-8"));
    wcout.imbue(locale("en_US.UTF-8"));

    wstring s;
    wstring t(L" la Polynésie française");

    wcin >> s;
    wcout << s << t << endl;
    return 0;
}

原文由 Bolo 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题