2007-02-15
■[PHP]文字化け
上鍵さんからツッコミが入ってますが、別の点を。
先ほどの例の時にも書いたが、PHPには内部エンコードという概念は存在しない。ではmbstring.internal_encodingとは何なのか。これは
なだけである。
PHPの文字化けを本気で解決する - ぎじゅっやさん
しかし、変換元が固定になるというのは重要なことなので、
これはソースコードと揃えておくのがBetter。
PHPの文字化けを本気で解決する - ぎじゅっやさん
変換元て。mbstring の関数てエンコーディング変換だけじゃないんだけどなぁ。mb_strlen だって mb_ereg 系の関数だってデフォルトのエンコーディングは mbstring.internal_encoding になるわけで、ソースコードと揃えるのは「Better」というより「原則」だろう。全ての mbstring 関数でいちいち指定したいなら別だけど。
detect_orderは必ず指定する
PHPの文字化けを本気で解決する - ぎじゅっやさん
えーと、本気で文字化けを解決したいなら、そもそも自動検出に依存しないようにするべきだろう。1年近く PHP のコードを書いてないけど、"detect_order を二次的に利用する" 必要性なんてあったかなぁ。外部リソースを読む必要があって、それがユーザ指定の場合(はてなブックマークとか Web 魚拓とか)ぐらいしか思いつかない。
http_outputは指定するだけでは何も動作しない。
これはmb_output_handlerが実行された時の出力エンコードに過ぎない。
ob_start("mb_output_handler")と指定されて初めて使われるのだ。
PHPの文字化けを本気で解決する - ぎじゅっやさん
また、微妙に誤解を振りまく記述だなぁ。php.ini に
output_handler = "mb_output_handler"
て書いておくと自動的に ob_start('mb_output_handler') される。鵜呑みにしていると軽くはまれます。
ob_startを実行しても、すべての出力に適用されるわけではない。http_outputの発動条件は
出力がtext/htmlである
必要がある。なのでapplication/xmlとかをヘッダーで投げていると動かないのだ。
PHPの文字化けを本気で解決する - ぎじゅっやさん
微妙にダウト。正しくは Content-type が "text/" で始まっている場合にのみ動作する。まぁ Content-type: application/xml のときに変換されないのは正しいけど。つうか、マニュアル読め。
でも自動変換に依存しないという方針には賛同できるかな。
エンコーディング変換の必要な箇所(入力パラメータの変換、urlencode する文字列の変換、出力ページの変換 等など)はライブラリとしてまとめておくか、設定1つで切り替わるようなフレームワークにしておくべきだと思うけどね。
些細なこと
上鍵さんもミスしてますが、Content-type の出力は
header('Content-Type: text/html; charset:<CHARSET>');
じゃなくて、
header('Content-Type: text/html; charset=<CHARSET>');
- 53 http://reader.livedoor.com/reader/
- 46 http://antenna.larme.dnsalias.net/
- 15 http://b.hatena.ne.jp/entrylist?sort=hot
- 13 http://d.hatena.ne.jp/Isoparametric/
- 10 http://d.hatena.ne.jp/Isoparametric/20070216/1171600967
- 7 http://b.hatena.ne.jp/entry/http://d.hatena.ne.jp/odz/20070130/1170217962
- 6 http://d.hatena.ne.jp/
- 6 http://labs.unoh.net/2007/02/get.html
- 5 http://arton.no-ip.info/diary/20070215.html
- 4 http://blog.so-net.ne.jp/Silv/2006-12-20