1


1

.NETストリームデコーダの動作

バイナリストリームから文字列のさまざまなエンコードをデコードしようとするプロセスがあります。 私はそれを介してステップするとき私は頭の中では全く足りないいくつかの行動を得る。 具体的には、

  • エンコードに使用される最大バイト数を取得します 指定されたエンコーディングの文字

  • ストリームからバイト数を取得する

  • `+ Encoding.GetCharCount +`を使用して、文字数を決定します それらのバイトでエンコードされている可能性があります(1または2は0の可能性があります…​)

  • ゼロでない場合は、 `+ Encoding.GetString +`を使用して文字を取得します バイト配列から

  • 次に、抽出されたものをエンコードするために使用されたバイト数を把握 文字とその量だけストリームインデックスを進めます

  • デコード可能なバイト数がゼロになった場合、 1バイトのインデックスを作成し、もう一度すべてを試してください…​この方法で、デコード可能な文字を見逃さないことを期待しています

BTW、誰かが上記でなされた誤った仮定に気付いたら、そう言うのを遠慮しないでください…​

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

何かご意見は?

ありがとう、ブライアン

*大きな更新:*問題に関する私の最初の説明には少し欠けているようです。 問題にもう少し前提を加えましょう。

  • ストリームは* extremely 大きい可能性があります-適合しない _ ほとんどのユーザーのメモリ

  • ストリーム内の任意の場所で、私がどこにいるかはわかりません テキストの先頭、テキストの途中

  • ストリーム内の任意の場所で、私が真ん中にいるかどうかわからない マルチバイト文字の始まり

  • ストリームには、実際にはテキストではない多くの素材が含まれます 並べ替え、およびさまざまなエンコーディングのごく一部

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

3 Answer


3


UTF8のようなエンコーディングでは文字に可変バイト数を使用するため、ストリームから取得する最大バイト数を単純に増やすことはできません。 最後のバイトが文字の途中にある(そして単独では無効である)か、最後の文字がその特定のエンコーディングでは完全に異なる文字を表す可能性があります。


1


ワオ。 強すぎるやり過ぎのようですね。 あなたのエンコーディングのGetDecoderメソッドを使ってみましたか? これは、バイト配列とchar配列を渡すGetCharsメソッドを使用してDecoderを処理し、char配列にバイト配列からデコードされた使用可能な文字を格納します。

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

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

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


1


私があなたの質問を正しく理解したならば、あなたは未知のエンコーディングでバイトストリームからcharデータを読もうとしていますか?

私の仮定が正しいのであれば、あなたは最初にエンコーディングを検出し、そしてこのエンコーディングで TextReaderを使用して読み取りバイトストリームを読む必要があります。あなたは、異なる文字サイズについて心配する必要はないでしょう、TextReaderはあなたのためにすべての仕事をします。

バイトストリームからエンコーディングを検出する方法は2つあります。

  1. http://code.google.com/p/ude/[Udeは、Mozilla Universal Charset DetectorのC#ポートです。

  2. IE MultiLangサービス