SOFTELメモ

</> 技術者募集

マルチバイト非対応関数で文字化け発生 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

関連するメモ

コメント(1)

mpyw 2015年8月14日 17:51

この記事には何度もお世話になりましたが、少し不正確な点があるので正確な記事をリンクしておきます。
http://qiita.com/masakielastic/items/abf8e54344034f9b089c