1

バイナリ ストリームから文字列のさまざまなエンコーディングをデコードしようとするプロセスがあります。一歩踏み出すと、頭の中でまったく理解できない動作が発生します。具体的には、私がしていることは次のとおりです。

  • 指定されたエンコーディングで文字をエンコードするために使用される最大バイト数を取得します
  • ストリームからバイト数を取得します
  • これらのバイトにエンコードされた可能性のある文字数を判断するために使用Encoding.GetCharCountします (0 1 つまたは 2 つになる可能性があります...)
  • ゼロでない場合Encoding.GetStringは、バイト配列から文字を取得するために使用します
  • 次に、抽出された文字をエンコードするために使用されたバイト数を計算し、その量だけストリーム インデックスを進めます
  • デコード可能なバイト数がゼロであることが判明した場合は、インデックスを 1 バイト進めて、もう一度やり直します...この方法では、デコード可能な文字を見逃さないことを期待しています

ところで、誰かが上記の誤った仮定に気付いた場合は、遠慮なくそう言ってください...

DedcoderFallbackExceptions特定のバイトセットをデコードできない場合にスローするようにデコーダーを設定しています。私を混乱させるのは、 を呼び出すときに例外が発生する場合と、 を呼び出すときに例外が発生する場合があるGetCharCountことGetStringです。これが起こるべき理由はありますか?これは実際に期待されていますか?できるだけ少ない場所で印刷可能な文字の存在を確実に確認できるようにしたいと考えています。現在、いくつかの場所で行っています。

何かご意見は?

ありがとう、ブライアン

重要な更新: 問題の最初の説明が少し不足しているようです。問題にいくつかの前提を追加しましょう。

  • ストリームは非常に大きくなる可能性があります -ほとんどのユーザーのメモリに収まりません
  • ストリーム内の任意の場所で、自分がテキストの先頭にいるのか、テキストの途中にいるのか確信が持てません
  • ストリーム内の任意の場所で、マルチバイト文字の途中または先頭にいるかどうかはわかりません
  • ストリームには、実際にはいかなる種類のテキストでもない多くの素材と、さまざまなエンコーディングの散らばったものが含まれます

うまくいけば、これでいくつかの問題が明確になります。これまでの回答は非常に役に立ちました!続けてください!

4

3 に答える 3

3

UTF8のようなエンコーディングでは、文字に可変バイト数を使用するため、ストリームからフェッチする最大バイト数を単純に乗算することはできません。最後のバイトが文字の途中にある場合(および単独で無効である場合)、または最後の文字がその特定のエンコーディングで完全に異なる文字を表す場合があります。

于 2009-07-01T23:06:25.247 に答える
1

わお。非常にやり過ぎのように聞こえます。エンコーディングの GetDecoder メソッドを使用してみましたか? バイト配列と char 配列をフィードする GetChars メソッドを使用して Decoder を渡し、バイト配列からデコードされた使用可能な文字で char 配列を埋めます。

オーバーシュート (スペア バイト) がある場合、これらは、次に新しいバイトで GetChars を呼び出したときにデコーダの状態に保存されます。

StringBuilder を使用して結果を組み立てることができます。

あなたの方法より少し簡単です。

于 2009-07-01T23:19:51.850 に答える
1

あなたの質問が正しく理解できれば、不明なエンコーディングでバイトストリームから char データを読み取ろうとしていますか?

私の仮定が正しければ、最初にエンコーディングを検出し、このエンコーディングでTextReaderを使用して読み取りバイト ストリームを読み取る必要があります。その後、さまざまな文字サイズについて心配する必要はありません。TextReader がすべての作業を行います。

バイトストリームからエンコーディングを検出する 2 つの方法を知っています。

  1. Ude は Mozilla Universal Charset Detector の C# ポートです
  2. IE MultiLang サービス
于 2009-07-02T09:34:27.980 に答える