gpt4 book ai didi

c++ - 将字符串流传递到 unicode 项目中的控制台输出

转载 作者:行者123 更新时间:2023-11-30 04:07:10 24 4
gpt4 key购买 nike

在MSVC++中,如果新建一个Visual Studio控制台应用程序(x64平台,运行在Windows 8.1,x64),并在main中将其设置为Unicode字符集,代码如下:

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

它输出这个:

00007FF616443E50

我希望它输出这个:

Testing Unicode. English - Ελληνικά - Español.

如何实现?

编辑:改为使用 wstringstream 和 wstring:

wstringstream stream; stream << _T("Testing Unicode. English - Ελληνικά - Español.") << std::endl;
wstring str = stream.str();
std::wcout << str.c_str();

输出被截断:

Testing Unicode. English -

像这样设置模式:_setmode(_fileno(stdout), _O_U16TEXT);

输出仍然不理想,因为并非所有字符都得到正确呈现:

Testing Unicode. English - ???????? - Español.

像这样设置输出 CP:SetConsoleOutputCP(CP_UTF8);

输出再次被截断:

Testing Unicode. English -

最佳答案

单独使用以下内容是行不通的。您还必须右键单击弹出的 Visual Studio 控制台。单击默认属性。单击字体选项卡并将字体设置为 Lucida Consolas。然后下面的代码将运行得很好。没有 << operator 的重载对于 Windows,它将不起作用。您可能还想为 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 Panel\Appearance and Personalization\Fonts .我点击了Font Settings然后取消选中 Hide fonts based on language settings .保存了选项。这将允许您书写日语和中文字符以及阿拉伯语和您想要的任何其他语言。似乎也可以使用默认的控制台字体。但是我必须重新启动才能生效。不确定它是否真的适用于其他人..

关于c++ - 将字符串流传递到 unicode 项目中的控制台输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22578567/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com