文字列

文字列の扱い

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

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

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

この記事のポイント

  • 旧字体漢字を正しい文字コードで表示する
  • mb_convert_encoding関数の使い方が分かる
  • 文字コード変換の実行結果が分かる

目次

基本編

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

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

関数のパラメータ

コード

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

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

コード例

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

if( $handle ) {
	while( ($buff = fgets($handle, 4096)) !== false ) {

		// パターン1
		var_dump( mb_convert_encoding( $buff, 'UTF-8', 'AUTO'));

		// パターン2
		var_dump( mb_convert_encoding( $buff, 'UTF-8', 'SJIS'));

		// パターン3
		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 ) {

		// パターン1
		var_dump( mb_convert_encoding( $buff, 'UTF-8', 'AUTO'));

		// パターン2
		var_dump( mb_convert_encoding( $buff, 'UTF-8', 'EUC-JP'));

		// パターン3
		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');
  • このエントリーをはてなブックマークに追加
前のページへ 一覧ページへ一覧 次のページへ