たくさんの txt ファイルがあり、それらを std::string に読み込みたいのですが、そのうちのいくつかは UCS-2、UTF-8 でエンコードされています。それらを std::string に読み込む方法。テキストファイルを std::string に読み込みたいだけです。それらを変換する必要がありますか?
1 に答える
それらがどのように読み取られるかは、OSがサポートするものと使用しているロケールによって異なります。
ロケールに触れずにファイルを単純に読み込んだだけで、そのロケールがstd c ++ライブラリが使用しているロケールと一致しない場合は、問題が発生する可能性があります。シングルバイト文字セットとマルチバイト文字セットの同様の問題。
ファイルを読み取る前にファイルのロケールを確認する信頼できる方法はありません(メタデータが間違っている可能性があります)。したがって、一般的な戦略は、最初に最も一般的な形式で読み取ってから、別の形式で再試行することです。それが失敗した場合(つまり、無効な文字が検出された場合)。それでもあいまいかもしれません。これは一見複雑な問題です。HTMLをクレイジーな文字セットで解析するのと同じ問題が発生します。
一般に、使用可能なファイルI / O関数のセットは2つあります。1つはマルチバイト文字セット用で、もう1つはシングルバイト文字セット用です。ただし、この機能のサポートはプラットフォーム固有であるため、特殊文字のサポートが追加されていない英語のローカライズされたOSを使用している場合、外部ライブラリを使用せずにマルチバイトセットをC++で直接サポートできない場合があります。
Microsoftは、cinおよびcoutに非標準の拡張機能を指定しています。それらの前にawを付けることにより、ストリームをバイト幅で区切ります。
wcout << "儫";
これは期待どおりに機能しますが、#define _UNICODE
コンパイルするには必要があります。ちなみに、WindowsはシステムAPI呼び出しの多くを2つのバージョンに分けています。1つはシングルバイト文字列を使用し、もう1つはマルチバイト文字列を使用します。つまりCreateProcessA
vs。CreateProcessW
_
要約すると、IO機能は文字セットのバイト幅とロケールに沿って分割されます。あなたの質問に対してより的を絞った答えを与えるために、私はあなたの目標についてもっと知る必要があります。これについてより良いアイデアを得るために、C++のロケールサポートを見てください。具体的には、ロケールは、、およびで機能ios_base
しimbue
ますgetloc
。現在、広く展開されているバージョンのC ++でこれらの問題を処理する良い方法はありませんが、これらの問題は今後のバージョンのC++で軽減されることを理解しています。