2

私は最初にユニコード文字列を含むこの巨大なファイルを持っています(最初の約10,000文字程度)ユニコード部分は気にしません、興味のある部分はユニコードではありませんが、それらの部分を読み込もうとすると'='、そして、ファイル全体をchar配列にロードし、(データを変更せずに)一時ファイルに書き込むと、ofstream誤ったデータが得られます。実際に得られるのは、テキストファイルだけですÍ。Unicode部分を手動で削除すると、すべてが正常に動作するため、Unicodeデータを含むストリームを処理できないようですifstreamが、この仮定が当てはまる場合、プロジェクトに新しいライブラリを導入するこのファイルで作業する方法はありますか?

ありがとう、

編集:これがサンプルコードです。プログラムは、ASCIIで表現できない文字(すべてではない)を含むこのファイルから読み取ります。

ifstream inFile("somefile");
inFile.seekg(0,ios_base::end);
size_t size = inFile.tellg();
inFile.seekg(0,ios_base::beg);
char *book = new  char[size];
inFile.read(book,size);
for (int i = 0; i < size; i++) {
  cout << book[i] << " " << i << endl; //book[i] will always be '='
}
ofstream outFile("TEST.txt");
outFile.write(book,size);
outFile.close();
4

2 に答える 2

4

キース・トンプソンの質問は非常に重要です。どの Unicode エンコーディングに応じて、Unicode 文字を読み取る (および破棄する) 小さな C ルーチンを作成することは簡単な場合もあれば、少し複雑になる場合もあります。

エンコーディングが UTF-8 であると仮定すると、ASCII は UTF-8 のサブセットであるため、いつ破棄を停止するかを決定するのに問題が生じるでしょう。 re back in ASCII land" で、次の文字がまだ ASCII の範囲外にある可能性があります。

したがって、ファイルを読み取って、127 より大きい最後の文字がどこにあるかを判断する必要があります。それ以降はプレーンな ASCII です -- 願わくば。

于 2012-12-04T06:58:20.500 に答える
0

通常、テキスト ファイルは、utf-8、utf-16 (ビッグまたはリトルエンディアン)、utf-32 (ビッグまたはリトルエンディアン)、または ASCII またはその他の ANSI コード ページの 1 つのエンコーディングです。エンコーディングの混合は、いくつかのカスタム方法でのみ可能です。

つまり、必要なデータとそうでないデータの両方を同じエンコーディングで読み取る必要があります。フォーマットが utf-8 であることがわかっている場合は、データで何をするかに応じて、ファイルをバイナリ ファイルとして char バッファーに少しずつ読み込むことができます。次に、strnextc (Windows の場合。他のプラットフォームでは同等の API を使用できる必要があります) のような API を使用して、バッファー上で文字ごとに移動できます。最後に到達したら、残高をバッファの先頭に移動し、残りのバッファをファイルからロードできます。

実際、上記のアプローチは一般的にどのエンコーディングにも使用できます。ただし、utf-16 の場合は、ファイルのエンディアンと実行するプラットフォームが同じであれば、wifstream を使用してみることができます。また、wifstream の実装がエンディネスの変更の処理に適しているかどうか、および BOM (バイト オーダー マーク) - 一般に存在する 2 バイト シーケンス ("FE FF" または "FF FE") を処理できるかどうかを確認する必要があります。ファイルの先頭 - サロゲート ペアはそのままにしておきます。

于 2012-12-04T07:23:01.823 に答える