C++ C++;:宽字符输出错误?
我的代码基本上是这样的:C++ C++;:宽字符输出错误?,c++,unicode,string,widestring,widechar,C++,Unicode,String,Widestring,Widechar,我的代码基本上是这样的: wstring japan = L"日本"; wstring message = L"Welcome! Japan is "; message += japan; wprintf(message.c_str()); 我希望使用宽字符串,但我不知道它们是如何输出的,所以我使用了wprintf。当我运行以下操作时: ./widestr | hexdump 十六进制代码点创建以下内容: 65 57 63 6c 6d 6f 21 65 4a 20 70 61 6e 61
wstring japan = L"日本";
wstring message = L"Welcome! Japan is ";
message += japan;
wprintf(message.c_str());
我希望使用宽字符串,但我不知道它们是如何输出的,所以我使用了wprintf。当我运行以下操作时:
./widestr | hexdump
十六进制代码点创建以下内容:
65 57 63 6c 6d 6f 21 65 4a 20 70 61 6e 61 69 20 20 73 3f 3f
e W c l m o ! e J p a n a i s ? ?
为什么它们都按顺序跳?我的意思是,如果wprintf是错误的,我仍然不明白为什么它会以如此混乱的顺序输出
编辑:endianness还是什么?它们似乎将每两个字符旋转。嗯
编辑2:我尝试使用wcout,但它输出完全相同的十六进制代码点。奇怪 您需要定义区域设置
#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;
}
#包括
#包括
#包括
#包括
使用名称空间std;
int main()
{
std::locale::global(std::locale(“”);
wstring日本=L“日本";
wstring message=L“欢迎!日本是”;
信息+=日本;
wprintf(message.c_str());
wcout也许你应该试试cout@phimuemue,它不起作用,它向我发送了大约30个错误,首先是widetr.cpp:18:error:no-match'operator你使用的是什么平台和编译器?我使用的是GCC/Linux 2.6(x86)你让它听起来像“代码> SycCysStdio和 WcOut是替代的;它们做完全不同的事情。如果您想更改wcout
所使用的区域设置,则需要使用imbue
。我无法测试它,但是wcout
应该在Windows上不使用代码页设置的情况下工作,因为wchar\u t
在Windows上是UTF-16代码单元,UTF-16是Windows唯一的本机编码。因此std::wcout
应该使用writeconwde>没有任何区域设置转换。如果没有,则是库错误。@Philipp这不是标准定义的。标准要求根据区域设置的代码页将宽字符转换为窄编码。这就是所做的。Windows的问题是它不支持UTF-8。因此,对于Windows,您可能需要我们elocale::globale(locale(“日本”))
并且它将在输出中使用Shift JIS编码。否则它将无法转换字符。microsofts标准库wcout
实现在内部使用全局c-locale
,因此嵌入区域设置实际上是无用的。您必须将所需的区域设置为全局区域设置…@Artyom:感谢您的评论。Th意味着<>代码>:ST::WCUT/<代码>在Windows上是无用的。我认为这是C++标准中的错误,它不必要地偏向UNIX.BTW,Windows控制台支持UTF-8(通过代码> SETCONSOLCOECODAGE < /代码>),但所有代码页都已过时,仅出于兼容性原因而保留。Shift JIS甚至比UTF-8更为过时,因为它不是Unicode编码。因此,人们似乎确实必须直接调用WriteConsoleW
。