PHPでマルチバイト文字列を扱うのはmbstringとiconvどっち使うといいのだろう
NibbleBlogというPHPで書かれたblogシステムがあります。
見た目が今どきな感じでデータベース不要。データをXMLテキストで保存するので小規模なblogにぴったりなシステムですが困ったことがあります。 それは、保存されたXMLデータの日本語文字列が文字化けしていること。
blogとしては文字化けしていないので問題ないかもしれないけれど、保存データにgrepしたりテキストを操作するツールが使えないのは、ちょっとイヤな感じだなと思って調べてみました。
それで分かったことは、NibbleBlogは、XMLの保存にSimpleXMLを使っています。 SimpleXMLは、UTF-8以外でエンコーディングされた文字列が入るとパースの問題が出るそうで、その対策のためutf8_encode関数を使って入力された文字列を強制的にUTF-8エンコードします。
このutf8_encode関数、入力された文字列を調べることもなく、入ってきた文字列はすべてISO-8859-1として扱うのでヘンにぶった切ってエンコードした結果、保存されたXMLは文字化けになっているという事らしい。
原因が分かれば、utf8_encodeを止めて、ほかのマルチバイト文字列を扱う関数で置き換えればということで、utf8_encode($val)と書いてある部分を、mbstringの mb_convert_encoding($val,"UTF-8","auto")に置き換えて、出力部分のutf8_decodeを削ったところでハタと気がついた。
もしかして、海外の人はmbstring使わないかも…?
PHPの知識は昔のままで止まっているのだけど、PHPで今どきのマルチバイト文字列を扱うのはmbstringとiconvどっちがいいんですかね?