マルチバイト非対応関数で文字化け発生 str_replace() と mb_ereg_replace()
マルチバイト非対応関数で文字列操作をすると、思わぬ文字化けを起こす場合があります。
//全角ハイフンを半角ハイフンにしたい echo str_replace("‐", "-", "京都府京都市 南区久世 上久世町ふにふにもふもふ");
/* 結果 */ 京都府京都市 南区久世。-綉彑つ・佞砲佞砲發佞發ユ
ハイフンなんてどこにもないのですが、上記ソースをEUC-JPで保存して実行すると再現できます。
全角ハイフンが A1BE、”(全角スペース)上”が A1A1|BEE5。マッチしてしまったようです。
対策その1 – マルチバイト対応関数を使う
//置換元の文字 $address1 = "京都府京都市 南区久世 上久世町ふにふにもふもふ"; $address2 = "京都府京都市 南区久世 上久世町7-7‐7"; //全角ハイフンを半角ハイフンに置換 echo mb_ereg_replace("‐", "-", $address1); echo mb_ereg_replace("‐", "-", $address2);
/* 結果 */ 京都府京都市 南区久世 上久世町ふにふにもふもふ 京都府京都市 南区久世 上久世町7-7-7
SJIS、EUCのマルチバイト文字列が入ってると分かってるデータは、マルチバイト対応関数で処理すべし。
対策その2 – UTF-8で行こう
UTF-8なら大丈夫。UTF-8の範囲はこう。マッチや置換に失敗しない。
(00-7f) 7bit (c0-df)(80-bf) 11bit (e0-ef)(80-bf)(80-bf) 16bit (f0-f7)(80-bf)(80-bf)(80-bf) 21bit (f8-fb)(80-bf)(80-bf)(80-bf)(80-bf) 26bit (fc-fd)(80-bf)(80-bf)(80-bf)(80-bf)(80-bf) 31bit
mpyw 2015年8月14日 17:51
この記事には何度もお世話になりましたが、少し不正確な点があるので正確な記事をリンクしておきます。
http://qiita.com/masakielastic/items/abf8e54344034f9b089c