PHPで「髙(はしごたか)」「﨑(たつさき)」が文字化ける(2)
Posted on 7月 20, 2006
Filed Under PHP |
IBM拡張文字の文字化け調査続き。
いろいろ調べると以下のページにたどり着きました。
まず、いきなり知らなかったことが、、、
# ちなみに、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.
Recently
- Let’s note CF-R4が壊れたのでCF-R9を購入
- 情報セキュリティスペシャリスト試験
- [Red5] 第18回InfoTalkで「Red5」の講演をしてきた@産業技術大学院大学
- [Red5] Adobeの「We Love Apple」のページの中にRed5が!
- [Red5] オープンソースカンファレンス2010 Tokyo/Spring で「Red5」の講演をしてきた@明星大学 2010-02-27
- [mixiアプリ] mixiアプリ「ビデオチャット」のオープンソース化
- [mixiアプリ] Flexでニックネームが一部文字化ける
- [mixiアプリ] ビデオチャットmixiアプリをローンチ
- データベーススペシャリスト試験
- [mixiアプリ] mixiアプリのお勉強
Categories
- AIIT
- Apache
- COBOL
- Database
- Flex
- Hardware
- Linux
- mixiアプリ
- MovableType
- MySQL
- OSS
- Others
- PG全般
- PHP
- Red5
- Seasar
- Smarty
- Software
- symfony
- Web関連
- 技術書
- 雑記
- 音楽 > JPop
- 音楽 > Trance
Archives
- 2010年 8月
- 2010年 6月
- 2010年 5月
- 2010年 3月
- 2010年 1月
- 2009年 9月
- 2009年 7月
- 2009年 5月
- 2008年 4月
- 2007年 12月
- 2007年 6月
- 2007年 5月
- 2007年 4月
- 2007年 3月
- 2007年 1月
- 2006年 12月
- 2006年 11月
- 2006年 10月
- 2006年 9月
- 2006年 8月
- 2006年 7月
- 2006年 6月
- 2005年 12月
- 2005年 7月
- 2005年 5月
- 2005年 4月
- 2005年 3月
- 2005年 2月
- 2005年 1月
- 2004年 12月