読者です 読者をやめる 読者になる 読者になる

VB.NETでも置換フォールバックで無限ループしたい

タイトル

意味不明なタイトルで大変恐縮ですが、要するに置換フォールバックって指定したエンコードスキームでエンコできない文字に当たった時に大体の文字を指定するフォールバック戦略でしたよね。 それだったら置換先にそのエンコードスキームでエンコできない文字を指定すれば

  1. エンコできない文字に当たる
  2. エンコーダが置換フォールバックバッファにエンコできない文字の代替文字を要求する
  3. バッファがエンコできない文字を返す
  4. バッファが返した文字をエンコしようとする
  5. エンコできないのでバッファに代替文字を要求する
  6. 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をスローするようです。 そもそも代替文字にエンコできない文字を指定すること自体が間違ってますが、そうなっても無限ループということはないみたいです。

めでたしめでたし

追記: 無限再帰ではなく無限ループなんじゃないかと思いまして、ちょっとそこを修正しました。