8

私のコードは基本的にこれです:

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 進数のコードポイントが出力されます。変!

4

1 に答える 1

14

ロケールを定義する必要があります

    #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について私が言ったことを忘れてください-これは正しくありません、それらはデフォルトで同期されます。必要ありません。

于 2010-06-28T07:26:23.490 に答える