PHPのexplode関数で文字化けして困っているならmb_split関数を使ってみよう

PHPのexplode関数で区切り文字を指定して文字列を分割して配列に格納する、というプログラミング作業をしていると、配列内の一部の文字が文字化けしていることに気づいた。
再現手順と解決方法(回避方法)を以下にメモとして記載する。

【explode関数で文字化けするプログラム例】
$str = "金|銀|銅|鉄|鋼|錫";
$str_array = explode("|",$str);
print_r($str_array);
?>

PHPはWindows版のPHP7を使用。
PHPプログラムの文字コードはシフトJIS。
このプログラムでは「|」(パイプ文字/縦棒)を区切り文字としている。

このPHPファイルをWindows 10のコマンドプロンプトで実行。
C:\Users\Owner\Desktop\nobu\php-7.1.10-Win32-VC14-x86>php ./test/test.php > ./test/testfile.txt

PHPで出力したファイルを見てみると文字化けしていた。
文字化けすることで配列が1つ増えていた。

PHP explode関数で文字化けした配列の例
PHP explode関数で文字化けした配列の例。

explode関数で文字化けを解決できる方法がよく分からなかったので、php.netに掲載されているexplode関数のマニュアルの下部に参考情報として「mb_split() - マルチバイト文字列を正規表現により分割する」というのがあったので、そちらを使ってみた。

【mb_split関数を使用しても文字化けするプログラム例】
$str = "金|銀|銅|鉄|鋼|錫";
$str_array = mb_split("\|",$str);
print_r($str_array);
?>

mb_splitは「|」(パイプ文字/縦棒)を正規表現の記号としてみなすので、「|」を単なる文字列として扱うために、エスケープシーケンス(¥の半角/バックスラッシュ)でエスケープしている。

このプログラムを実行すると、残念ながら文字化けがますます悪化した。
文字化けすることで配列が1つ減っていた。
「|」が区切り文字として認識されていないオカシナ現象も起きていた。

PHP mb_split関数で文字化けした配列の例
PHP mb_split関数で文字化けした配列の例。

php.netのmb_split関数のマニュアルを読むと、「注意: mb_regex_encoding() で指定した文字エンコーディングを、 この関数の文字エンコーディングとして使用します。」という記述があったので、mb_regex_encodingでシフトJISを指定したプログラムに修正。

【mb_split関数を使用して文字化けを解決(回避)したプログラム例】
mb_regex_encoding('SJIS-win');
$str = "金|銀|銅|鉄|鋼|錫";
$str_array = mb_split("\|",$str);
print_r($str_array);
?>

文字化け問題は無事に解決(回避)できたようである。
mb_split関数を使用する時はmb_regex_encodingで文字コードをきちんと指定しないといけないことがよく分かった。

PHP mb_split関数で文字化けしていない配列の例
PHP mb_split関数で文字化けしていない配列の例。

この後、3万文字ほどのテキストを処理したが文字化けしていなかった。
絶対に文字化けしない、などとは言い切れないけれど、日本語文字列を分割して配列に格納する処理をする場合は、explode関数よりもmb_split関数の方がよさそうであると思った。

前へ

Windows版PHPでphp_mbstring.dllが見つからない場合のエラーの原因と解決方法の1つ

次へ

2017年 ゆっポくんをさがせ!リターンズのイラストが「かご」の銭湯・金町湯