はじめに
意味不明なタイトルで大変恐縮ですが、要するに置換フォールバックって指定したエンコードスキームでエンコできない文字に当たった時に大体の文字を指定するフォールバック戦略でしたよね。 それだったら置換先にそのエンコードスキームでエンコできない文字を指定すれば
- エンコできない文字に当たる
- エンコーダが置換フォールバックバッファにエンコできない文字の代替文字を要求する
- バッファがエンコできない文字を返す
- バッファが返した文字をエンコしようとする
- エンコできないのでバッファに代替文字を要求する
- 3に戻る
って現象になって無限ループになるんじゃないかと思ったのです。
試す
物は試しです。
Module Module1
Sub Main()
Dim d = Encoding.GetEncoding(
"Shift_JIS",
New EncoderReplacementFallback("Å"),
New DecoderReplacementFallback("Å")
)
Dim source = "hello Å こんにちは"
Dim bytes = d.GetBytes(source)
For Each byt In bytes
Console.Write("{0:X2} ", byt)
Next
End Sub
End Module
無慈悲なSystem.ArgumentException
再帰的なフォールバックは文字 \u00C5 に対して許可されていません。 パラメーター名:chars
System.ArgumentExceptionがスローされました。
無限ループには陥ってないみたいです。
呼び出し階層を辿って眺めてみるとエンコーダフォールバッファーさんは一定回数フォールバックに失敗したらその時点で無限ループに陥ってると判断しSystem.ArgumentExceptionをスローするようです。
そもそも代替文字にエンコできない文字を指定すること自体が間違ってますが、そうなっても無限ループということはないみたいです。
めでたしめでたし