VB.NETでも置換フォールバックで無限ループしたい
はじめに
意味不明なタイトルで大変恐縮ですが、要するに置換フォールバックって指定したエンコードスキームでエンコできない文字に当たった時に大体の文字を指定するフォールバック戦略でしたよね。 それだったら置換先にそのエンコードスキームでエンコできない文字を指定すれば
- エンコできない文字に当たる
- エンコーダが置換フォールバックバッファにエンコできない文字の代替文字を要求する
- バッファがエンコできない文字を返す
- バッファが返した文字をエンコしようとする
- エンコできないのでバッファに代替文字を要求する
- 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
をスローするようです。
そもそも代替文字にエンコできない文字を指定すること自体が間違ってますが、そうなっても無限ループということはないみたいです。
めでたしめでたし