gpt4 book ai didi

c++ - 如何将 C++ wstring UTF-8 字符打印到 Mac OS 或 Unix 终端?

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:23:03 30 4
gpt4 key购买 nike

如何打印 std::wstring使用 std::wcout

我尝试了以下,推荐here , 但它仅适用于打印此 ¡Hola!但不是这个日本 :

#include <iostream>
#include <clocale>

int main(int argc, char* argv[])
{
char* locale = setlocale(LC_ALL, "");
std::cout << "locale: " << locale << std::endl; // "C" for me
std::locale lollocale(locale);
setlocale(LC_ALL, locale);
std::wcout.imbue(lollocale);
std::wcout << L"¡Hola!" << std::endl; // ok
std::wcout << L"日本" << std::endl; // empty :(
return 0;
}

还有以下(推荐 here )根本不打印日文字符:

#include <stdio.h>
#include <string>
#include <locale>
#include <iostream>

using namespace std;

int main()
{

std::locale::global(std::locale(""));
wstring japan = L"日本";
wstring message = L"Welcome! Japan is ";

message += japan;

wprintf(message.c_str());
wcout << message << endl;
}

所有这些都是在 Mac OS 10.6.8 上进行的。使用 g++ 4.2.1,使用终端 2.1.2。

终端通常可以很好地显示字符,例如,当我 cat源代码。此外,此命令工作正常 cout << "日本" << std::endl; , 但我确实需要打印 wstring .

我的 $LANG这是:

$ echo $LANG 
en_US.UTF-8

最佳答案

打印 wstring 的方式是将其转换为基于 UTF-8 字符的字符串。认真的wchar_t is pointless在 Windows 之外或不幸采用 wchar_t 的各种其他平台库之一,然后才清楚这是一个多么糟糕的主意。

// move to clang and libc++ then
#include <codecvt>

int main(){
std::wstring_convert<std::codecvt_utf8<wchar_t>,wchar_t> convert; // converts between UTF-8 and UCS-4 (given sizeof(wchar_t)==4)
std:wstring s = L"日本";
std::cout << convert.to_bytes(s);
}

只是为了解释您显示的代码中出了什么问题;

char* locale = setlocale(LC_ALL, ""); 
std::cout << "locale: " << locale << std::endl; // "C" for me

此处的区域设置字符串是应用更改后的区域设置名称。既然你说你得到“C”,那就意味着你使用的是“C”语言环境。通常一个人会得到一个像“en_US.UTF-8”这样的名字,但无论出于何种原因,您的环境都没有正确设置。您显示 $LANG 设置正确,但其他语言环境变量之一的设置可能不同。

无论如何,您使用的是“C”语言环境,它只需要支持基本字符集。我相信在 OS X 上你会得到的行为是任何 char 将直接转换为相同的 wchar_t 值,并且只有 wchar_tchar 支持的范围将转换回来。这实际上与使用基于 ISO 8859-1 的语言环境相同,因此日文字符将不起作用。


如果您真的坚持让这种基于语言环境的东西起作用,那么您需要获得一个合适的语言环境,一个使用 UTF-8 的语言环境。您可以找出您的环境出了什么问题,也可以使用不可移植的显式语言环境名称。

std::wcout.imbue(std::locale("en_US.UTF-8"));
std::wcout << L"¡Hola!\n";
std::wcout << L"日本\n";

此外,如果您使用的是 libstdc++,您应该知道它在 OS X 上不能正确支持语言环境。您必须使用 libc++ 才能获得 OS X 的语言环境名称(例如,“en_US.UTF-8” ) 工作。

关于c++ - 如何将 C++ wstring UTF-8 字符打印到 Mac OS 或 Unix 终端?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11512656/

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