Xslate 1.5008 released
異常系の振る舞いを少し変えました。
Xslateでは、render()
へ渡すテンプレートパラメータや登録関数からの戻り値は必ずEncodeモジュールでデコードしたテキスト文字列であるべきです。しかし、デコードしてないバイト列を渡したときの挙動は未定義で、XS/PPあるいはcacheの有無によって挙動が異なっていました。特にcacheの有無で挙動が変わることがあるのが厄介で、特定の条件が重なるとリロードすると文字化けするという挙動を示すことがありました。
Xslateに限らず、Perlではスクリプト内のテキストの操作はデコードされたテキスト文字列で行うべきで、これを守らなければ文字化けを引き起こします。よって、Xslateでも、上記のようにデコードされていないバイト列を与えると文字化けが起きるのが、Perl的には正しい振る舞いといえます。実際、XslateのPP版ではそのようになっていました。一方、XS版では様々な理由により、間違った入力を与えても文字化けが置きないことがありました。
今回のバージョンアップでは、その際の挙動を定義し、input_layerで:utf8
をしてある場合(つまりデフォルト)には、render()
にUTF-8でエンコードされたバイト列を与えても文字化けしないようにしました。input_layerに:raw
を与えた場合、今まで通り常にバイト列で処理します。
この挙動により、間違った入力でも文字化けが起きにくくなると思います。しかし、文字化けを100%防ぐものではありませんし、Perlの挙動を変えるものでもありません。プログラムを堅固に運用するためにも、Xslateへのテンプレートパラメータは常にデコードしたテキスト文字列にして渡すことをお勧めします。
参考:perlunifaq