2

これは可能ですか?ロシア語を含む単純なファイルを読み取ろうとしましたが、明らかに機能していません。

file.imbue(loc) を呼び出しました (この時点で、loc は正しいです、Russia_Russia.1251)。buf は basic_string<wchar_t> 型です

私が basic_ifstream<wchar_t> を使用している理由は、これがテンプレートであるためです (技術的には basic_ifstream<T> ですが、この場合は T=wchar_t)。

これはすべて英語の文字で完全に機能します...

while (file >> ch)
{
    if(isalnum(ch, loc))
    {
        buf += ch;
    }
    else if(!buf.empty())
    {
        // Do stuff with buf.
        buf.clear();
    }
}

ロシア語の文字を読んでいるときにゴミが表示される理由がわかりません。(たとえば、ファイルに хеы хеы хеы が含まれている場合、"яюE"、5(square)、K(square) などを取得します...

4

4 に答える 4

1

Unicode エンコーディングを処理できる std::codecvt を持たない STL 実装がまだたくさんあります。それらの wchar_t テンプレート ストリームは、ファイル名などで Unicode が有効になっている場合でも、デフォルトでシステム コード ページになります。ファイルに実際に UTF-8 が含まれている場合、ジャンクが生成されます。たぶんこれが役に立ちます

于 2010-03-17T17:42:12.280 に答える
1

コード ページ 1251 は Unicode 用ではありません。メモリが機能する場合は、8859-5 用です。残念ながら、あなたの iostream の実装は、そのままでは UTF-16 をサポートしていない可能性があります。これを行うとデータを変更せずに渡すだけなので、これは少し奇妙ですが、ほとんどの場合、まだサポートされていません。少なくとも私の記憶が正しければ、C++ 0x はこれを追加することになっています。

于 2010-03-17T17:09:09.480 に答える
0

デフォルトでは、Iostreams は、Unicode を処理しない既存のプログラムとの互換性のために、ディスク上のすべてのデータが非 Unicode 形式であると想定します。C++0x は、ネイティブ Unicode サポートを許可することでこれを修正しますが、現時点ではstd::codecvt<wchar_t, char, mbstate_t>、通常の char データをワイド文字に変換するために iostream によって使用される があります。cplusplus.com のstd::codecvt の説明を参照してください。

std::codecvt<wchar_t, wchar_t, mbstate_t>iostream で Unicode を使用する場合は、データを変更せずに渡すだけの形式で codecvt ファセットを指定する必要があります。

于 2010-03-17T17:41:31.543 に答える
0

よくわかりませんが、 setlocale(LC_CTYPE, ""); を呼び出してみてください。

于 2010-03-17T18:42:54.283 に答える