odz buffer

2007-02-15

[]文字化け

上鍵さんからツッコミが入ってますが、別の点を。

先ほどの例の時にも書いたが、PHPには内部エンコードという概念は存在しない。ではmbstring.internal_encodingとは何なのか。これは

mbstring関数デフォルトエンコード

なだけである。

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>');

elfelf 2007/02/21 00:16 ぐは
コピペいくないですね(苦笑
いつもご指摘ありがとうございます

odzodz 2007/02/21 14:08 あ、いえいえ。どもです。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証