C ++:広い文字が間違って出力しますか?
-
01-10-2019 - |
質問
私のコードは基本的にこれです:
wstring japan = L"日本";
wstring message = L"Welcome! Japan is ";
message += japan;
wprintf(message.c_str());
私は広い文字列を使いたいと思っていますが、それらがどのように出力されているかわからないので、WPRINTFを使用しました。次のようなことを実行するとき:
./widestr | hexdump
16進コードポイントはこれを作成します。
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が間違っている場合、そのような特定のごちゃごちゃした順序で出力する理由がまだわかりません!
編集:エンディアンネスか何か?彼らはそれぞれ2つのキャラクターを回転させているようです。は。
編集2:WCOUTを使用してみましたが、まったく同じ16進コードポイントを出力します。変!
解決
ロケールを定義する必要があります
#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;
}
期待どおりに機能します(つまり、幅の幅を狭いUTF-8に変換して印刷します)。
グローバルロケールを「」に定義すると、システムロケールを設定します(UTF -8の場合、UTF -8として印刷されます - つまり、wstringが変換されます)
編集: sync_with_stdioについて私が言ったことを忘れてください - これは正しくありません、それらはデフォルトで同期されます。必要ありません。
所属していません StackOverflow