Encodingクラスでは、エンコード・デコードできない文字があった場合は代替文字への置き換えが行われる。 GetEncodingメソッドの引数でEncoderFallback・DecoderFallbackを指定すると、エンコード・デコードできない文字があった場合の動作(フォールバック)を変更することができる。
デフォルトの動作
デフォルトでは、Encodingクラスはエンコード・デコードできない文字を代替文字に置き換える。 UTF-8やUTF-16へのエンコード/からのデコードでは�
(U+FFFD REPLACEMENT CHARACTER)が、ASCIIやShift JISなどへのエンコードでは?
(クエスチョンマーク)が代替文字として使用される。
代替文字列への置き換え (EncoderReplacementFallback/DecoderReplacementFallback)
EncoderReplacementFallbackクラス・DecoderReplacementFallbackクラスを使うと、エンコード・デコード時に使用する代替文字列を指定することができる。
GetEncodingメソッドは引数encoderFallbackとdecoderFallbackで任意のEncoderFallback・DecoderFallbackを指定できるようになっている。 この引数にEncoderReplacementFallback・DecoderReplacementFallbackを渡すことでエンコード・デコード時に使用する代替文字列を指定することができるようになる。
なお、EncoderReplacementFallback・DecoderReplacementFallbackには代替文字列として空文字(String.Empty)を指定することもできるため、エンコード・デコードできない文字を無視して消去することもできる。
定義済みのフォールバック
GetEncodingメソッドは引数encoderFallback・decoderFallbackにnullを指定するとArgumentNullExceptionをスローする。 nullの代わりに、以下のような定義済みのフォールバックを指定することができる。
EncoderFallbackプロパティ・DecoderFallbackプロパティ
EncodingクラスのEncoderFallbackプロパティ・DecoderFallbackプロパティを参照するとインスタンスに設定されているフォールバックを取得することができる。
このプロパティ自体は読み取り専用ではなく設定も可能となっているが、GetEncodingメソッドなどから取得したインスタンスでは読み取りとなっていて、プロパティを設定しようとすると実行時に例外InvalidOperationExceptionがスローされる。
インスタンスのクローンを作成すると、クローンは読み取り専用ではなくなりプロパティの設定ができるようになる。
例外のスロー (EncoderExceptionFallback/DecoderExceptionFallback)
EncoderExceptionFallbackクラス・DecoderExceptionFallbackクラスを使うと、エンコード・デコードできない文字があった場合に例外をスローさせるようにすることができる。
このフォールバックを指定すると、エンコードできない文字があった場合には例外EncoderFallbackExceptionが、デコードできない場合には例外DecoderFallbackExceptionがそれぞれスローされるようになる。
独自のフォールバックの定義
EncoderFallbackクラス・DecoderFallbackクラスを継承して適切に実装することで独自のフォールバックを定義することができる。
EncoderFallback・DecoderFallbackでは、エンコード・デコード時に代替文字列の生成を行うEncoderFallbackBuffer・DecoderFallbackBufferを取得できるように実装する。 EncoderFallbackBuffer・DecoderFallbackBufferでは、エンコード・デコードできない文字があった場合に代替文字列の生成(もしくはEncoderFallbackExceptionなどのスロー)を行うように実装する。 EncoderFallbackBufferが生成する代替文字列は、対象のエンコーディングで使用できる文字のみで構成されている必要がある。
次の例では、EncoderFallbackクラス・EncoderFallbackBufferクラスを継承し、エンコードできない文字をUnicodeスカラ値表記(U+XXXX)に変換したものを代替文字列として生成するようにしている。