将字符串流传递给unicode项目中的控制台输出
Passing a stringstream to console output in unicode project
在msvc++中,如果您创建一个新的Visual Studio控制台应用程序(x64平台,运行在Windows 8.1, x64),并将其设置为Unicode字符集,在main中使用以下代码:
int _tmain(int argc, _TCHAR* argv[])
{
stringstream stream;
stream << _T("Testing Unicode. English - Ελληνικά - Español.") << std::endl;
string str = stream.str();
std::wcout << str.c_str();
cin.get();
}
输出如下:
00007 ff616443e50
我希望它输出如下:
测试Unicode。英文- Ελληνικά - Español.
如何做到这一点?
编辑:用wstringstream和wstring代替:
wstringstream stream; stream << _T("Testing Unicode. English - Ελληνικά - Español.") << std::endl;
wstring str = stream.str();
std::wcout << str.c_str();
输出被截断:
测试Unicode。英语- - - - - -
设置模式如下:_setmode(_fileno(stdout), _O_U16TEXT);
输出仍然是不需要的,因为不是所有的字符都被正确地呈现:
测试Unicode。中文- ????????——西班牙人。
像这样设置输出CP: SetConsoleOutputCP(CP_UTF8);
输出再次被截断:
测试Unicode。英语- - - - - -
单独使用下面的代码是不行的。您还必须做的是右键单击弹出的Visual Studio控制台。单击默认属性。点击字体选项卡,将字体设置为Lucida Consolas。那么下面的代码就可以正常运行了。没有超载的<< operator
为窗口,它将无法工作。您可能还想为char
或wchar_t
重载,或者简单地将其设置为模板重载。
如果你不喜欢超载,你可以使用_setmode(_fileno(stdout), _O_U16TEXT);
或_setmode(_fileno(stdout), _O_U8TEXT);
为UTF16和UTF8恭顺。
// Unicode.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <sstream>
#include <iostream>
#if defined _WIN32 || defined _WIN64
#include <Windows.h>
#else
#include <io.h>
#include <fcntl.h>
#endif
#if defined _WIN32 || defined _WIN64
std::ostream& operator << (std::ostream& os, const char* data)
{
SetConsoleOutputCP(CP_UTF8);
DWORD slen = strlen(data);
WriteConsoleA(GetStdHandle(STD_OUTPUT_HANDLE), data, slen, &slen, nullptr);
return os;
}
std::ostream& operator << (std::ostream& os, const std::string& data)
{
SetConsoleOutputCP(CP_UTF8);
WriteConsoleA(GetStdHandle(STD_OUTPUT_HANDLE), data.c_str(), data.size(), nullptr, nullptr);
return os;
}
std::wostream& operator <<(std::wostream& os, const wchar_t* data)
{
DWORD slen = wcslen(data);
WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), data, slen, &slen, nullptr);
return os;
}
std::wostream& operator <<(std::wostream& os, const std::wstring& data)
{
WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), data.c_str(), data.size(), nullptr, nullptr);
return os;
}
#endif
int _tmain(int argc, _TCHAR* argv[])
{
std::wstringstream stream;
stream << _T("Testing Unicode. English - Ελληνικά - Español.") << std::endl;
#if !defined _WIN32 && !defined _WIN64
_setmode(_fileno(stdout), _O_U16TEXT);
#endif
std::wstring str = stream.str();
std::wcout << str;
std::wcin.get();
return 0;
}
在Windows上还有一个东西可以帮助渲染任何语言的字体。我发现这不是张贴在其他任何地方在网上…我导航到Control PanelAppearance and PersonalizationFonts
。我点击了Font Settings
,然后选中了Hide fonts based on language settings
。保存选项。这将允许您编写日文和中文字符以及阿拉伯语和其他任何您想要的语言。似乎也适用于默认的控制台字体。但我必须重新启动才能生效。不确定它是否真的适用于其他人…
- VS2017 中缺少 Win32 控制台应用程序.如何创建C++空项目?
- Visual Studio 2017 c++ win32 控制台项目模板
- 如何从 Linux 控制台使用 CMake 构建 Eclipse C++ 项目(没有可用的 GUI)
- 嵌入批处理脚本文件并在C 控制台项目中运行
- 从 WebAPI 项目运行静态类时出现 StackOverflow 异常 - 从控制台应用程序运行时工作正常
- 在视觉工作室中创建了一个空项目,它似乎不再打开控制台?
- C++/CLI 项目如何在控制台窗口中显示消息
- 将函数从控制台应用程序移动到共享库项目似乎会带来不相关的编译错误
- 将Win32控制台项目模板添加到Visual Studio社区2017 15.5.2
- 在 win32 控制台项目 VS2015 中静态链接 libcurl 的问题
- Visual Studio:如何在没有控制台窗口的情况下启动项目
- 一个解决方案,两个项目:如何从 Windows 应用程序调用控制台项目?C++
- 在Visual Studio 2010中将控制台项目转换/移植到无形应用程序
- 在Xcode控制台项目中创建和使用C++库
- 在单声道项目和 C++ 控制台应用之间传输数据
- 如何在控制台项目中重写一行文本?c++
- 可视化如何将项目 win32 控制台应用程序转换为C++ Windows 窗体
- visual 无法在控制台应用程序项目中包含头文件C++
- 为什么我不能在 QBS 项目中使用控制台输出?
- 链接CLR控制台项目中的C++/CLI库