PHPプログラミング

ベストプラクティス

はしご高などの旧字体漢字の文字化けを防ぐ

  • このエントリーをはてなブックマークに追加

日本語の処理を行っていると、たまに発生する文字化け問題。氏名に旧字体漢字を使っている場合に発生することもあるかと思います。そこで、今回はこの旧字体漢字による文字化けを防ぐ方法を解説していきます。

基本編

「髙」や「﨑」などの旧態文字が変換すると「?」に変わってしまったときの1つの対処方法。

ここでは、文字コードを変換するためのmb_convert_encoding関数を使い、各種文字コードの指定を試していきます。

関数のパラメータ

コード

まず、文字コード「Shift-JIS」で作成した次のテキストファイルを用意し、PHPで読み込んで文字変換を行ってみます。

Shift-JIS形式のテキストファイル

$handle = fopen('test1', 'r');

if( $handle ) {
	while( ($buff = fgets($handle, 4096)) !== false ) {
		var_dump( mb_convert_encoding( $buff, 'UTF-8', 'AUTO'));
		var_dump( mb_convert_encoding( $buff, 'UTF-8', 'SJIS'));
		var_dump( mb_convert_encoding( $buff, 'UTF-8', 'SJIS-win'));
	}
}

fclose($handle);

実行結果

実行結果

解説

1つ目は「AUTO」から「UTF-8」へ変換を行いました。「AUTO」は特定の文字コードを指定しなくても変換できる便利なパラメータですが、今回の場合ではうまくいきませんでした。

2つ目は「SJIS」から「UTF-8」への変換。Shift-JISですが、こちらもだめ。

3つ目はうまく変換できました。「Shift-JIS-win」から「UTF-8」への変換。

以上の結果から、「SJIS」は対応できないけど「SJIS-win」なら対応できることが分かりました。このSJIS-winとは一体何者か。こちらはMicrosoftが拡張したShift-JISで、通常のShift-JISよりも扱える文字が多くなっています。旧字体漢字をはじめ、「(株)」や丸で囲まれた数字なんかの文字も扱える文字コードです。

実行結果


UTF-8からShift-JISへ変換

逆に「UTF-8」から「Shift-JIS」への変換をしたい場合は、先ほどと真逆の変換を行います。「SJIS」では文字化けしてしまいますので注意してください。

コード

mb_convert_encoding( $data, 'SJIS-win', 'UTF-8');

EUC-JPからUTF-8へ変換

今度は「EUC-JP」から「UTF-8」への変換を試してみます。文字コード「EUC-JP」で次のようなテキストファイルを用意し、読み込んで変換を行なっていきます。

EUC-JP形式のテキストファイル

コード

$handle = fopen('test', 'r');

if( $handle ) {
	while( ($buff = fgets($handle, 4096)) !== false ) {
		var_dump( mb_convert_encoding( $buff, 'UTF-8', 'AUTO'));
		var_dump( mb_convert_encoding( $buff, 'UTF-8', 'EUC-JP'));
		var_dump( mb_convert_encoding( $buff, 'UTF-8', 'CP51932'));
	}
}

fclose($handle);

実行結果

pic_result3

解説

1つ目の「AUTO」から「UTF-8」への変換、及び2つ目の「EUC-JP」から「UTF-8」への変換はうまく行きませんでした。

3つ目の「Cp51932」から「UTF-8」への変換はうまくいきました。この「CP51932」はあまり見慣れない文字コードセットかもしれませんが、こちらはMicrosoftが定義した文字コードで、EUC-JPに日本語の特殊文字を追加したものになります。

Shift-JISが旧字体漢字をカバーするためにSJIS-winへと拡張されたことと同様に、EUC-JPもカバーできるように拡張した文字コードが作成されました。


UTF-8からEUC-JPへ変換

逆に「UTF-8」から「EUC-JP」への変換をしたい場合は、先ほどと真逆の変換を行います。「EUC-JP」では文字化けしてしまいますので注意してください。

コード

mb_convert_encoding( $data, 'CP51932', 'UTF-8');
  • このエントリーをはてなブックマークに追加