バイナリ ストリームから文字列のさまざまなエンコーディングをデコードしようとするプロセスがあります。一歩踏み出すと、頭の中でまったく理解できない動作が発生します。具体的には、私がしていることは次のとおりです。
- 指定されたエンコーディングで文字をエンコードするために使用される最大バイト数を取得します
- ストリームからバイト数を取得します
- これらのバイトにエンコードされた可能性のある文字数を判断するために使用
Encoding.GetCharCount
します (0 1 つまたは 2 つになる可能性があります...) - ゼロでない場合
Encoding.GetString
は、バイト配列から文字を取得するために使用します - 次に、抽出された文字をエンコードするために使用されたバイト数を計算し、その量だけストリーム インデックスを進めます
- デコード可能なバイト数がゼロであることが判明した場合は、インデックスを 1 バイト進めて、もう一度やり直します...この方法では、デコード可能な文字を見逃さないことを期待しています
ところで、誰かが上記の誤った仮定に気付いた場合は、遠慮なくそう言ってください...
DedcoderFallbackExceptions
特定のバイトセットをデコードできない場合にスローするようにデコーダーを設定しています。私を混乱させるのは、 を呼び出すときに例外が発生する場合と、 を呼び出すときに例外が発生する場合があるGetCharCount
ことGetString
です。これが起こるべき理由はありますか?これは実際に期待されていますか?できるだけ少ない場所で印刷可能な文字の存在を確実に確認できるようにしたいと考えています。現在、いくつかの場所で行っています。
何かご意見は?
ありがとう、ブライアン
重要な更新: 問題の最初の説明が少し不足しているようです。問題にいくつかの前提を追加しましょう。
- ストリームは非常に大きくなる可能性があります -ほとんどのユーザーのメモリに収まりません
- ストリーム内の任意の場所で、自分がテキストの先頭にいるのか、テキストの途中にいるのか確信が持てません
- ストリーム内の任意の場所で、マルチバイト文字の途中または先頭にいるかどうかはわかりません
- ストリームには、実際にはいかなる種類のテキストでもない多くの素材と、さまざまなエンコーディングの散らばったものが含まれます
うまくいけば、これでいくつかの問題が明確になります。これまでの回答は非常に役に立ちました!続けてください!