微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c – 我怎么可以和一些unicode文本?

我问一个代码片段,它是一个unicode文本,将另一个unicode连接到第一个unicode文本,并且cout是结果.

附:这个代码将帮助我解决unicode的另一个更大的问题.但关键的是要完成我所要求的.

ADDED:BTW当我运行可执行文件时,我无法在命令行中写入任何unicode符号.我应该怎么做

解决方法

这是一个示例,它显示了四种不同的方法,其中只有第三种(C conio)和第四种(本地 Windows API)可以工作(但是只有当stdin / stdout不被重定向时).请注意,您仍然需要包含要显示的字符的字体(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,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有一点,如迈克尔·卡普兰的博客所描述的,但似乎只有wgets将(8位)的ReadFile数据解释为UTF-16.我会在周末进一步调查一下.

原文地址:https://www.jb51.cc/c/116261.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐