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,您可能需要我们e
locale::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