要素に日本語文字(他のマルチバイト文字も含む)が使われている
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文字ずつを切り出していく、という感じになると思います。
http://www.php.net/manual/ja/function.mb-strlen.php
http://www.php.net/manual/ja/function.mb-substr.php
# 効率悪そう...
mb_ereg_replace_callback か mb_ereg_replace を使うと、もうちょっとスマートに書けそうな気もしますが、ソースの移植なら愚直に元のコードのロジックをそのまま使う、という方がトラブルが少ないような気もします。
http://www.php.net/manual/ja/function.mb-ereg-replace-callback.php
http://www.php.net/manual/ja/function.mb-ereg-replace.php
こんな感じで正規表現を使うなら置換できると思いますが。
2013/03/14 10:54:49