我问一个代码片段,它是一个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.我会在周末进一步调查一下.