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