5
4

1 に答える 1

8

L文字列リテラルの前にドロップします。std::stringではなく、使用してくださいstd::wstring

UPD: より良い (正しい) 解決策があります。wchar_t、wstring、および L を保持setlocale(LC_ALL,"")し、プログラムの先頭で呼び出します。

setlocale(LC_ALL,"")とにかく、プログラムの最初に呼び出す必要があります。これにより、デフォルトの「C」ロケールではなく、環境のロケールで動作するようにプログラムが指示されます。あなたの環境にはUTF-8があるので、すべてがうまくいくはずです。

を呼び出さないとsetlocale(LC_ALL,"")、プログラムは UTF-8 であることを「認識する」ことなく、UTF-8 シーケンスで動作します。正しい UTF-8 シーケンスが端末に表示される場合、それは UTF-8 として解釈され、すべて正常に表示されます。andを使用するstringとこうなりcharます: gcc は文字列のデフォルトのエンコーディングとして UTF-8 を使用し、ostream は変換を適用せずに喜んでそれらを出力します。ASCII文字のシーケンスがあると考えています。

しかし、 を使用するwchar_tと、すべてが壊れます。gcc は UTF-32 を使用し、正しい再エンコードが適用されず (ロケールが「C」であるため)、出力はガベージです。

プログラムを呼び出すとsetlocale(LC_ALL,"")、UTF-32 を UTF-8 に再コード化する必要があることを認識し、すべてがうまくいきます。

これはすべて、UTF-8 のみを使用することを前提としています。任意のロケールとエンコーディングを使用することは、この回答の範囲を超えています。

于 2011-07-23T12:51:01.183 に答える