PHPで「髙(はしごたか)」「﨑(たつさき)」が文字化ける(2)

Posted on 7月 20, 2006
Filed Under PHP |

IBM拡張文字の文字化け調査続き。

いろいろ調べると以下のページにたどり着きました。

 [pgsql-jp: 30776] Re: 漢字3 とは

まず、いきなり知らなかったことが、、、

# ちなみに、Widnows 用ブラウザの EUC-JP は、上記ページで説明され
# ている eucJP-open(eucJP-ms) とは別物で互換性はないので注意が必
# 要です。

わぁお。
・・・こいつは知らなかった。。。

つまり、ブラウザに表示させる時の文字コードがEUCだとIBM拡張文字は表示されないと。。。
あくまでWindows上への表示はSJISになるようにしないとダメなのですね。

いろいろ試した結果、以下の設定をした上で、かつ、mb_convert_xxxxx関数の
from-encordingを’SJIS-win’という固定文字列にすることでうまくできました。

    ini_set('default_charset'              , 'SJIS');
    ini_set('mbstring.internal_encoding'   , 'eucJP-win');
    ini_set('mbstring.http_output'         , 'SJIS-win');

ポイントは「eucJP-win」と「SJIS-win」を使うところでしょうか。

まず、「default_charset」の設定を「SJIS」にし、ブラウザで表示するときの
文字エンコーディングが シフトJIS になるようにします。

次に、「mbstring.internal_encoding」の設定で内部エンコーディングが
「eucJP-win」になるようにします。
内部エンコーディングを「EUC-JP」にした場合、「髙」などのIBM拡張文字 が
半角スペースになり、文字が欠落してしまいました。

最後に「mbstring.http_output」の設定で、出力文字エンコーディングが
「SJIS-win」になるようにします。
「SJIS-win」の代わりに「Windows-31J」を指定しても大丈夫なようです。
こちらも普通の「SJIS」にした場合は、IBM拡張文字が半角スペースになってしまいました。

ちなみに、以下の設定を行った上で、かつ、mb_convert_xxxxx関数のfrom-encordingに
mb_detect_order() を指定した場合はうまくできませんでした。

    ini_set('default_charset'              , 'SJIS');
    ini_set('mbstring.internal_encoding'   , 'eucJP-win');
    ini_set('mbstring.http_output'         , 'SJIS-win');
    ini_set('mbstring.detect_order'        , 'ASCII,JIS,UTF-8,SJIS-win,EUC-JP');

試しに mb_detect_encoding() 関数を利用して自動検出した文字コードを
調べたところ、「EUC-JP」と検出されていたせいのようです。

なぜだろうと考えているうちに、なぜか急にふと思い、
detect_orderの設定を次のようにして試してみました。

    mb_detect_order(array('ASCII','JIS','UTF-8','SJIS-win','EUC-JP'));

ini_set関数ではなくmb_detect_order関数を使って配列で文字コード検出順序を渡す方法です。

まぁ、当然結果は変わるわけないだろうと思っていたんですが・・・・・・

・・・・・・えぇっ!!?

なんと、mb_detect_encoding() 関数の自動検出が「SJIS-win」になったではありませんか!
マジ意味わかんないよPHP。

試行錯誤の果て、最終的に次の記述でうまくいきました。。。

    ini_set('default_charset'              , 'SJIS');
    ini_set('mbstring.internal_encoding'   , 'eucJP-win');
    ini_set('mbstring.http_output'         , 'SJIS-win');
    mb_detect_order(array('ASCII','JIS','UTF-8','SJIS-win','EUC-JP'));

この設定をした上で文字コード変換を次のようにしてやります。

        $_enc_to=mb_internal_encoding();
        $_enc_from=mb_detect_order();
        mb_convert_variables($_enc_to,$_enc_from,$array);

たぶんこれで大丈夫。
mb_convert_encoding関数を使う場合も以下の感じで大丈夫でした。

        $_enc_to=mb_internal_encoding();
        $_enc_from=mb_detect_order();
        $string=mb_convert_encoding($string,$_enc_to,$_enc_from);

それにしても文字変換は難しいわね!PHPちゃん!!

そのうちIBM拡張文字をMySQLに保存したら文字化けたりしないか試してみたいと思います。。。
MySQL5.0.3以上ならeucjpmsで大丈夫そうだけど4.1系だとどうなのかな。。。
UTF-8にしとけば大丈夫なのだろうか。。。

Comments

Leave a Comment

If you would like to make a comment, please fill out the form below.

Name (必須)

Email (必須)

ウェブサイト

コメント

Protected by WP-Hashcash.

Recently


Categories


Archives


Wordpress Themes