質問: の、 要素に日本語文字(他のマルチバイト文字も含む)が使われている xmlファイルをパースして、 その文字を一文字ずつ取り出し、SJISのコード値の指定のものだったら cp932のコード値に変換して、保存する、Javaソースコードがあります。 前任者がで書いたこのコードを、PHPに書き直してくれと言われました。 (言っている人は、JavaもPHPも詳しくないSEです。) 前任者の方は その文字列(Stringオブジェクト)から、charAt( )で 一文字ずつ取り出し、switch文で指定のSJISコード値かどうかを 判定しています。 例. case '\u2014': // '―' だったら、 → \u2015 に置き換え。 case '\u301C': // '~' だったら、 → \uFF5E に置き換え。 case '\u00A2': // '¢' だったら、 → \uFFE0 に置き換え。 case '\u00A3': // '£' だったら、 → \uFFE1 に置き換え。 といった具合にです。 そこで質問ですが、このような判定をPHPでは、出来なくない ですか?マルチバイト文字を一文字ずつ取り出す方法ってある でしょうか?
回答: mb_strlen で、マルチバイト文字列としての文字数を取得して、それでループしながら mb_substr でマルチバイトとしての1文字ずつを切り出していく、という感じになると思います。 # 効率悪そう... mb_ereg_replace_callback か mb_ereg_replace を使うと、もうちょっとスマートに書けそうな気もしますが、ソースの移植なら愚直に元のコードのロジックをそのまま使う、という方がトラブルが少ないような気もします。