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

我要求一个代码片段,它包含一个unicode文本,将另一个unicode连接到第一个unicode文本,并将结果cout连接起来。

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

添加:BTW我运行可执行文件时,不能在命令行中写入任何unicode符号。 我应该怎么做?

下面是一个示例,显示了四种不同的方法,其中只有第三个(C conio )和第四个(本地Windows API)工作(但只有stdin / stdout没有重定向)。 请注意,您仍然需要包含您要显示的字符的字体(Lucida控制台至少支持希腊语和西里尔语)。 请注意,这里的一切都是完全不可移植的,在终端上没有可移植的方式来输入/输出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 :我已经在Michael Kaplan的博客中描述了一下_O_U16TEXT ,但是看起来只有wgetsReadFile的(8位)数据解释为UTF-16。 我会在周末进一步调查。

取决于你的意思是什么类型的Unicode。 我假设你的意思是你只是在使用std::wstring 在这种情况下使用std::wcinstd::wcout

对于编码之间的转换,您可以使用您的操作系统函数,如Win32: WideCharToMultiByteMultiByteToWideChar或者您可以使用像libiconv

我过去也遇到过类似的问题,在我的情况下, sync_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; } 

如果你有实际的文本(即一个逻辑字符串),那么插入宽的流代替。 宽流将自动编码您的字符以匹配预期的区域设置编码。 (如果你有编码位,流将解码这些位,然后重新编码它们以匹配区域设置。)

如果你知道你有UTF编码的比特(比如意欲被解码为一串逻辑字符的比特数组) ,并且你知道输出流的目标期望的是非常相同的比特格式,那么你可以跳过解码和重新编码的步骤,并按原样写入()。 这只有当你知道双方使用相同的编码格式时才有效,对于不打算与其他地区的进程进行通信的小型实用程序,情况可能如此。

这取决于操作系统。 如果你的操作系统理解你可以简单地发送它的UTF-8序列。