SOFTELメモ Developer's blog

会社概要 ブログ 調査依頼 社員募集 ...

【php】はしご高が文字化けしない文字コード変換

問題

phpでShift_JISからEUC-JPなど文字コード変換しているのですが、はしご高、㈱などの環境依存文字(機種依存文字)って化けますよね?

php-logo

答え

php5.2.1から文字コードCP51932やiso-2022-jp-msが使えるようになっていて、これがあるかどうかでだいぶ違う。

CP51932 とは、EUC-JP系の文字コードで、Windows特有の文字(IBM拡張文字)が範囲に含まれる文字コード。[ [ [ euc-jp領域 ] eucjp-win領域 ] CP51932領域 ] みたいな具合。IBM拡張文字には、はしご高や異体字の黒、館、塚 etc. が含まれる。

iso-2022-jp-ms は、PHP5.2.1 から追加された拡張エンコードで、iso-2022-jp でサポートされていない範囲の半角カナや機種依存文字等などに対応したエンコード。

CP51932、iso-2022-jp-ms を使うことで、IBM拡張文字を含む文字列を文字コード変換できる。

php5.2.1以降なら以下が可能。

UTF-8 → Shift_JIS

// ○ OK
mb_convert_encoding('髙', 'sjis-win', 'UTF-8');
// × 以下はダメ
mb_convert_encoding('髙', 'Shift_JIS', 'UTF-8');

UTF-8 → EUC-JP

// ○ OK
mb_convert_encoding('髙', 'CP51932', 'UTF-8');
// × 以下はダメ
mb_convert_encoding('髙', 'eucjp-win', 'UTF-8');
mb_convert_encoding('髙', 'EUC-JP', 'UTF-8');

EUC-JP → Shift_JIS

// ○ OK
mb_convert_encoding('髙', 'sjis-win', 'CP51932'));
// △ なぜか化けないのだけど、安心できない
mb_convert_encoding('髙', 'sjis-win', 'EUC-JP');
mb_convert_encoding('髙', 'Shift_JIS', 'EUC-JP');
// × 以下はダメ
mb_convert_encoding('髙', 'Shift_JIS', 'eucjp-win');
mb_convert_encoding('髙', 'Shift_JIS', 'CP51932');
mb_convert_encoding('髙', 'sjis-win', 'eucjp-win');

EUC-JP → UTF-8

// ○ OK
mb_convert_encoding('髙', 'UTF-8', 'CP51932');
// × 以下はダメ
mb_convert_encoding('髙', 'UTF-8', 'eucjp-win');
mb_convert_encoding('髙', 'UTF-8', 'EUC-JP');

Shift_JIS → EUC-JP

// ○ OK
mb_convert_encoding('髙', 'CP51932', 'sjis-win');
// × 以下はどれもダメ
mb_convert_encoding('髙', 'EUC-JP', 'Shift_JIS');
mb_convert_encoding('髙', 'eucjp-win', 'Shift_JIS');
mb_convert_encoding('髙', 'CP51932', 'Shift_JIS');
mb_convert_encoding('髙', 'EUC-JP', 'sjis-win');
mb_convert_encoding('髙', 'eucjp-win', 'sjis-win');

Shift_JIS → UTF-8

// ○ OK
mb_convert_encoding('髙', 'UTF-8', 'sjis-win');
// × これはだめ
mb_convert_encoding('髙', 'UTF-8', 'Shift_JIS')

→ JIS

// ○ OK
mb_convert_encoding('髙', 'iso-2022-jp-ms', 'sjis-win');
mb_convert_encoding('髙', 'iso-2022-jp-ms', 'CP51932');
mb_convert_encoding('髙', 'iso-2022-jp-ms', 'UTF-8');

JIS →

// ○ OK
mb_convert_encoding('髙', 'sjis-win', 'iso-2022-jp-ms');
mb_convert_encoding('髙', 'CP51932', 'iso-2022-jp-ms');
mb_convert_encoding('髙', 'UTF-8', 'iso-2022-jp-ms');

メモ

JIS補助漢字(JIS X 0212)はこれでも化けるので注意。

関連するメモ

コメント