#PHP でもutf8_decodeは使ってはならない

(更新日: 2009/09/22)

Twitterで書いた方が良いようなエントリですが、たまには良いでしょう。

#perl – utf8::decode()ではなくEncode::decode_utf8()を使うべき理由

という記事がありました。PHPにも似た関数、utf8_decodeがあります。PHPでも使ってはなりません。日本人というよりマルチバイト圏で使っている人はほとんどいないはずです。理由はコードを見れば一目瞭然です。

ext/xml/xml.c – PHP 5.2.11より

ここで定義されているISO-8859-1, US-ASCII, UTF-8がPHPのXMLモジュールのutf8_decode/utf8_encodeでサポートしている文字エンコーディングです。それ以外はデコードもエンコードもされず、そのままの文字列が返ります。実装も文字エンコーディングチェックに使える様な実装ではありません。

Perlの方はどうなっているかソースを見てみました。以下のC関数がデコードする関数です。

universal.c – perl 5.8.9より

これだけ見ても分からないと思いますが、マクロの定義を見ていくと文字エンコーディングのチェックに使えない事は直ぐに分かります。

シングルバイト圏の人が作った関数とはこんな感じで、どの言語でも同じ様なものなのかも知れません。と思ってRubyのコードを覗いてみました。1.8, 1.9共にlib/rexmlにutf8_decodeが定義されています。

ruby-1.9.1-p243/lib/rexml/encodings/UTF-8.rb より(1.8.7でも同じ)

詳しく調べませんでしたが、Rubyでは文字列をそのまま返しています。別の仕組みで文字エンコーディングチェックはできるとしても、decode_utf8では無理なようです。

全ての文字列系の関数で文字エンコーディングチェックが行われる(行える)と考えるない方が良いことが分かります。

 

Comments

comments

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です