最終更新日:
公開日:
レシピ
文字列の扱い
はしご高など旧字体漢字の文字化けを防ぐ
旧字体漢字「髙」「﨑」や「①」「㈱」、半角カタカナなどの文字化けを防ぐための文字コード変換について解説します。
この記事のポイント
- 旧字体漢字や記号が文字化けしない文字コードが分かる
- 「CP51932」はマイクロソフト版EUC-JP
目次
日本語をカバーしている文字コードは少ない
日本語は「髙 (はしご高)」や「﨑」などの旧字体漢字を含め、「①」「㈱」などの半分記号になっているものや半角カタカナなど非常に多くの文字が存在します。
これらの文字を正常に表示することができる文字コードは限られてくるため、文字コード変換も非常にデリケートです。
そこで今回は、文字化けが起こりやすい漢字や記号をmb_convert_encoding関数で変換し、文字化けが起きない文字コードを検証します。
文字コード変換する文字列
髙﨑纊①㈱㌔アイウエオあいうえおabc
PHP コード例
mb_convert_encoding( "髙﨑纊①㈱㌔アイウエオあいうえおabc", "SJIS-win", "utf-8");
また、今回使用するのは次の文字コードとします。
- UTF-8
- SJIS
- SJIS-win
- EUC-JP
- eucJP-win
- CP51932
- ISO-2022-JP
- ISO-2022-JP-MS
補足となりますが、「SJIS」は「Shift_JIS」の省略形、「CP51932」はマイクロソフトが使用しているEUC-JP互換の文字コードセットです。
UTF-8から他の文字コードに変換
まずは「UTF-8」から他の文字コードへ変換を行なっていきます。
PHP コード例
// SJIS-win
echo mb_convert_encoding( "髙﨑纊①㈱㌔アイウエオあいうえおabc", "SJIS-win").'<br>';
// SJIS-win
echo mb_convert_encoding( "髙﨑纊①㈱㌔アイウエオあいうえおabc", "SJIS-win", "AUTO").'<br>';
// SJIS
echo mb_convert_encoding( "髙﨑纊①㈱㌔アイウエオあいうえおabc", "SJIS", "UTF-8").'<br>';
// SJIS-win
echo mb_convert_encoding( "髙﨑纊①㈱㌔アイウエオあいうえおabc", "SJIS-win", "UTF-8").'<br>';
// EUC-JP
echo mb_convert_encoding( "髙﨑纊①㈱㌔アイウエオあいうえおabc", "EUC-JP", "UTF-8").'<br>';
// eucJP-win
echo mb_convert_encoding( "髙﨑纊①㈱㌔アイウエオあいうえおabc", "eucJP-win", "UTF-8").'<br>';
// CP51932
echo mb_convert_encoding( "髙﨑纊①㈱㌔アイウエオあいうえおabc", "CP51932", "UTF-8").'<br>';
// ISO-2022-JP
echo mb_convert_encoding( "髙﨑纊①㈱㌔アイウエオあいうえおabc", "ISO-2022-JP", "UTF-8").'<br>';
// ISO-2022-JP-MS
echo mb_convert_encoding( "髙﨑纊①㈱㌔アイウエオあいうえおabc", "ISO-2022-JP-MS", "UTF-8").'<br>';
出力例
// SJIS-win
髙﨑纊①㈱㌔アイウエオあいうえおabc // OK
// SJIS-win
髙﨑纊①㈱㌔アイウエオあいうえおabc // OK
// SJIS
??????アイウエオあいうえおabc
// SJIS-win
髙﨑纊①㈱㌔アイウエオあいうえおabc // OK
// EUC-JP
??纊???アイウエオあいうえおabc
// eucJP-win
��纊①㈱㌔アイウエオあいうえおabc
// CP51932
髙﨑纊①㈱㌔アイウエオあいうえおabc // OK
// ISO-2022-JP
???????????あいうえおabc
// ISO-2022-JP-MS
髙﨑纊①㈱㌔アイウエオあいうえおabc // OK
「UTF-8」からの変換では、「SJIS-win」「CP51932」「ISO-2022-JP-MS」の3つは正常に変換することができました。
つまり、旧字体漢字は次の4つの文字コードで扱えることが分かります。
- UTF-8
- SJIS-win
- CP51932
- ISO-2022-JP-MS
以降は、これらの変換がうまく行った文字コードに絞って変換を検証していきます。
SJIS-winから他の文字コードに変換
続いて、「SJIS-win」から他の文字コードに変換していきます。
PHP コード例
// まずは「SJIS-win」へ変換
$str1 = mb_convert_encoding( "髙﨑纊①㈱㌔アイウエオあいうえおabc", "SJIS-win");
// UTF-8
echo mb_convert_encoding( $str1, "UTF-8", "SJIS-win").'<br>';
// SJIS
echo mb_convert_encoding( $str1, "SJIS", "SJIS-win").'<br>';
// CP51932
echo mb_convert_encoding( $str1, "CP51932", "SJIS-win").'<br>';
// ISO-2022-JP-MS
echo mb_convert_encoding( $str1, "ISO-2022-JP-MS", "SJIS-win");
出力例
// UTF-8
髙﨑纊①㈱㌔アイウエオあいうえおabc // OK
// SJIS
??????アイウエオあいうえおabc
// CP51932
髙﨑纊①㈱㌔アイウエオあいうえおabc // OK
// ISO-2022-JP-MS
髙﨑纊①㈱㌔アイウエオあいうえおabc // OK
念のため「SJIS」への変換も試していますが、やはり文字化けしてしまいます。
それ以外の文字については正常に変換することができました。
CP51932から他の文字コードに変換
引き続き、「CP51932」から他の文字コードに変換していきます。
PHP コード例
// まずは「CP51932」へ変換
$str1 = mb_convert_encoding( "髙﨑纊①㈱㌔アイウエオあいうえおabc", "CP51932");
// UTF-8
echo mb_convert_encoding( $str1, "UTF-8", "CP51932").'<br>';
// SJIS-win
echo mb_convert_encoding( $str1, "SJIS-win", "CP51932").'<br>';
// eucJP-win
echo mb_convert_encoding( $str1, "eucJP-win", "CP51932").'<br>';
// ISO-2022-JP-MS
echo mb_convert_encoding( $str1, "ISO-2022-JP-MS", "CP51932");
出力例
// UTF-8
髙﨑纊①㈱㌔アイウエオあいうえおabc // OK
// SJIS-win
髙﨑纊①㈱㌔アイウエオあいうえおabc // OK
// eucJP-win
��纊①㈱㌔アイウエオあいうえおabc
// ISO-2022-JP-MS
髙﨑纊①㈱㌔アイウエオあいうえおabc // OK
「SJIS-win」が正常に変換されるなら「eucJP-win」もいけそうですが、やはりダメでした。
旧字体漢字のみ文字化けしてしまいます。
それ以外の文字コードは正常に変換することができました。
ISO-2022-JP-MSから他の文字コードに変換
最後に、「ISO-2022-JP-MS」から他の文字コードに変換していきます。
PHP コード例
// まずは「SJIS-win」へ変換
$str1 = mb_convert_encoding( "髙﨑纊①㈱㌔アイウエオあいうえおabc", "ISO-2022-JP-MS");
// UTF-8
echo mb_convert_encoding( $str1, "UTF-8", "ISO-2022-JP-MS").'<br>';
// SJIS-win
echo mb_convert_encoding( $str1, "SJIS-win", "ISO-2022-JP-MS").'<br>';
// CP51932
echo mb_convert_encoding( $str1, "CP51932", "ISO-2022-JP-MS").'<br>';
// ISO-2022-JP
echo mb_convert_encoding( $str1, "ISO-2022-JP", "ISO-2022-JP-MS");
出力例
// UTF-8
髙﨑纊①㈱㌔アイウエオあいうえおabc // OK
// SJIS-win
髙﨑纊①㈱㌔アイウエオあいうえおabc // OK
// CP51932
髙﨑纊①㈱㌔アイウエオあいうえおabc // OK
// ISO-2022-JP
???????????あいうえおabc
一応、念のため「ISO-2022-JP」への変換を試していますが案の定文字化けしました…。
それ以外は正常に変換されました。