2009-03-10 4 views
3

多くの言語のあらゆる種類の文字を含む多くのテキストを出力する必要があります。時には、Unicode以外の文字エンコーディング(Shift-JIS、ISO-8859-2など)で出力する必要がある場合もあります。.NET:エンコーディングが文字列内のすべての文字をサポートしているかどうかを確認するにはどうすればよいですか?

エンコーディングで扱えない文字(たとえば、ISO-8859-2のエンコードされた出力の日本語文字)がテキストに含まれていると、出力に奇数文字が表示されます。私はそれらをエスケープすることができますが、私はむしろそれが本当に必要な場合にのみ行うでしょう。

私の質問は、次のとおりです。文字列内のすべての文字をエンコードできるかどうかを事前に伝える方法はありますか?

EDIT: EncoderFallbackは私が尋ねた質問におそらく正解だと思います。残念ながら、私の特別な状況ではうまくいかないようです。私の考えは、文字をHTMLエンティティに相当するものに変換することでした(例:モの代わりに)。しかし、エンコーダーは最初に見つかったそのような文字を変換するだけで、Response.ContentEncodingを設定すると、決してEncoderFallbackを呼び出すことはありません。

答えて

5

EncoderFallbackクラスを作成して、エンコードする前にエンコーダーに割り当てることができます。

このアプローチを使用すると、高度な処理(何も問題を探している出力文字列を処理している可能性が高い)では何もする必要はありません。

代わりに、フォールバッククラスでは、エンコードに文字の値が含まれていない場合にのみ置換を処理する必要があります。

+0

ありがとうございました。私は少し時間を節約できました:) – Ciaran

0

ターゲットエンコードに変換して元に戻して比較しますか?

Encoding.GetBytes()とEncoding.GetStrings()を試してみてください。

最適化として、使用したすべてのユニコード文字を元の文字列から検索し、それを使ってエンコードを試してみることができます。

3

エンコーディングでEncoderFallbackEncoderExceptionFallbackに設定されたエンコードで文字列をエンコードしてみます。例:

Encoding e= Encoding.GetEncoding(932, new EncoderExceptionFallback(), new DecoderExceptionFallback()); 

GetBytes()をキャッチすると、EncoderFallbackExceptionがキャッチされます。

0

私は方法が既に動作するはずだと思います。 (EncoderFallbackのソリューションはかなりいいようです)しかし、あなたが好む場合に備えて、代わりの方法があります。

encoding.GetEncoder()を呼び出して、テストするエンコード用のエンコーダを作成します。 次に、エンコーダーオブジェクトのConvertメソッドを呼び出し、テキストを渡して、の完了したパラメータの値を調べて、成功したかどうかを判断できます。

スピードが問題になる場合は、さまざまな方法をベンチマークすることができますが、すべて同じパフォーマンスプロファイルがあると思われます。

関連する問題