なんたらノート第三期ベータスマートフォン用の表示で見るなんたらノート第三期ベータこの広告は、90日以上更新していないブログに表示しています。2008-07-18文字エンコーディング混在PHPページPHPこのエントリは2007/06/21の再掲ですひとつのロケールに複数の文字エンコーディングがある、日本語のような言語では、ひとつの動的Webページを書くだけでも、部分ごとにエンコーディングの向き不向きがあります。多くのWebブラウザがShift_JISを好むことから、出力をShift_JISのみと限定された場合、ページレイアウトのデザイナとコード実装者で、使いたいエンコーディングが変わってきます。デザイナにとっては、出力がShift_JISの場合は、METAタグのContent-TypeにShift_JISと書いておくのが一番作業しやすいでしょう。それをもとにコードのエンコーディングを自動判別してしまうエディタが多々あるため、HTMLのコードもShift_JISで書きたくなります。プログラム実装者はShift_JISでコーディングできないので困ります。*NIX文化で育ったPHPは、プログラムコードにShift_JISを含めることができません。Shift_JIS文字を使うと、2バイト目に出現するバイトがエスケープ文字と文字コード一致するとき、構文パーサが文字化けを引き起こします。<?php$hoge."の表";?>と書くと文字列が閉じません。この二者はおそらく、別のファイルに分けて作業したものを結合させるでしょう。さあ、Smartyを使いますか?いえいえ、P言語業界には、あんなヘビーウェイトなものをインストールする必要/権限などない仕事のほうが多いんですよ。多くの場合、ページレイアウトの一部にを挿入し、そこから決まった名前の関数を呼び出すのが最適解のはずです。このときよく起こる問題は、最後まで二者が同じ文字コードを使いたがらなかったとき(むしろ一致するほうが珍しい)です。Shift_JISでコーディングさせ、いちいち2バイト目を気にしながら、丁寧に\記号を挿入させますか?デザイナの表示テスト作業に、毎回文字コード変換を強制しますか?それとも、Shift_JIS出力をあきらめるよう顧客を説得しますか?どれもすべて、避けたい道です。できれば、顧客を説得する苦労をこれ以上増やさず、ほとんどのHTMLはデザイナがShift_JISで書き、ダイナミック要素についてはUTF-8かEUC-JPで実装しながらテストしたいですね。そんなことできるんでしょうか?答えは、できる、です。出力バッファリングを使い、二者の境界で文字コードを切り替えます。EUC-JPの出力を行うコードをShift_JISのページから利用する場合はこんな具合です。//この関数はEUC-JPで出力します。ob_end_flush();?>この手法を一般化したものをダウンロード可能にしておきました。詳しい理解のためには、ソースを読んでハックしてください。jcoderegion.zipたしかに、コードパートが生成する出力文字列は、レンダリングに2倍のコストがかかります。Smartyが5〜20倍のコストをページ全体にかけてしまうことを思えば、かわいいものではないでしょうか?出力バッファリングはネスト可能なので、php.iniやもっと上の構造で何らかの出力バッファリングをすでに行っていた場合でも、上位構造にいっさい影響を与えることなく、閉じたスコープ内で処理が完結します。新しいことをやるたびに不安の負債が溜まるPHPですが、この手法はわりと安心できる類のものです。バッファリングについておまけ情報。PHPプログラミングではよく、「プログラムの一番最初でないと、HTTPヘッダ情報を書き出すことができない」という問題が発生します。これ、「ヘッダ情報の処理がすべて完了するまで、すべての出力をバッファリングしておく」という回避テクニックがマニュアルに書いてあるのをご存知ですか?この問題の原因は、少しでもHTML本文パートを出力してしまうと、もうHTMLヘッダに戻って書きなおせないためなのです。バッファに貯めておけば、HTML本文パートが出力されたことにならないんですね。ついでにちょっと知っておくと便利かも。(1)月別アーカイブはてなブログをはじめよう!tanakahisateruさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。