我如何cin和cout一些unicode文本? [英] How can I cin and cout some unicode text?

查看:276
本文介绍了我如何cin和cout一些unicode文本?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我问一个代码片段,其中cin是unicode文本,连接另一个unicode一个到第一个unicode文本和cout的结果。

I ask a code snippet which cin a unicode text, concatenates another unicode one to the first unicode text and the cout the result.

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

P.S. This code will help me to solve another bigger problem with unicode. But before the key thing is to accomplish what I ask.

ADDED:BTW当我运行可执行文件时,我不能在comman行中写任何unicode符号。

ADDED: BTW I can't write in the comman line any unicode symbol when I run the executable file. How I should do that?

推荐答案

这里有一个示例显示了四种不同的方法,其中只有第三种c $ c> conio )和第四个(本机Windows API)工作(但只有当stdin / stdout未重定向时)。请注意,您仍然需要一个包含要显示的字符的字体(Lucida控制台至少支持希腊语和西里尔字母)。请注意,这里的一切都是完全不可移植的,只是没有可移植的方式在终端上输入/输出Unicode字符串。

Here is an example that shows four different methods, of which only the third (C conio) and the fourth (native Windows API) work (but only if stdin/stdout aren't redirected). Note that you still need a font that contains the character you want to show (Lucida Console supports at least Greek and Cyrillic). Note that everything here is completely non-portable, there is just no portable way to input/output Unicode strings on the terminal.

#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);
}




  • :我添加了一个基于 conio 的方法。

  • 编辑2 :我搞乱了与 _O_U16TEXT 有点像迈克尔·卡普兰的博客,但似乎只有 wgets 解释(8位)来自 ReadFile 的数据为UTF-16。我会在周末进一步调查这个问题。

    • Edit 1: I've added a method based on conio.
    • Edit 2: I've messed around with _O_U16TEXT a bit as described in Michael Kaplan's blog, but that seemingly only had wgets interpret the (8-bit) data from ReadFile as UTF-16. I'll investigate this a bit further during the weekend.
    • 这篇关于我如何cin和cout一些unicode文本?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆