[PHP-users 28879] Re: 文字化け
choice
info @ choice-site.com
2006年 3月 29日 (水) 13:16:27 JST
松本さま
レスありがとうございます。
なかでです。
----------------------- Original Message -----------------------
On Tue, 28 Mar 2006 19:01:20 +0900
"Reiji Matsumoto" <matsumoto @ spline.oc.to> wrote:
> 松本です。
> > この前処理というのは
> > ・ini_setで文字コード関係のPHPの設定を行う
> > ・magic_quotes_gpcはoff。必要があれば自身でクォートする
> > ・入力文字列については必要があれば文字コード変換を行う
> > という感じの処理でしょうか?
> http_input 等の処理はスクリプト開始前に行われますので、ini_set
> で設定するのでは遅いです。
なるほど。
たしかに
http://php.s3.to/man/function.ini-set.html
などのマニュアルでini_setをよく見ると
magic_quotes_gpcやmbstring.encoding_translationの変更の可否は
PHP_INI_PERDIR(php.ini, .htaccess または httpd.confで設定可能
なエントリ)となってますね。これはスクリプトに入る前に処理される
からスクリプト内からini_setを使っても設定できないということ
なんですね。
> よって、php.iniや.htaccessの状態が
> どのような場合でも正確に内部エンコーディングに変換した文字列
> を得られる事を理想とするなら、ini_setは利用できません。
>
> 私としては、
> ・magic_quotes_gpc がオンかも知れないしオフかも知れない
> ・mbstring.encoding_translationはオンかも知れないしオフかも知れない
> ・mbstring.http_input は pass かも知れないし autoかも知れない
> ・どのような文字コードが送信されてくるかは分からないが、一度
> に送信される文字コードはすべて統一されている
>
> というような状態を仮定して、以下のようなコードを前処理に利用
> しています。
>
> $key='J'; // 判定用としてGET、POSTする変数
> $val='京'; // 判定用文字
> $inenc = 'EUCJP'; // 内部エンコーディング
> $conv_table = array("EUCJP","SJIS","UTF8");// 調査する文字コード
>
> foreach($conv_table as $conv)
> {
> if(mb_convert_encoding($_POST[$key],$inenc,$conv) === $val)
> {
> foreach($_POST as $k => $v)
> {
> if(get_magic_quotes_gpc()) $_POST[$k] = stripslashes($_POST[$k]);
> $_POST[$k] = mb_convert_encoding($v,$inenc,$conv);
> }
> break;
> }
> }
>
> 実際には配列が入れ子になっている場合やGET変数、COOKIE等の処理も含め
> もう少し複雑です。
> とても幸いな事に、magic_quotes_gpcの処理はmbstring.encoding_translation
> より後に行われるようなので、上記コードで大抵の場合はEUCJPに変換され
> るようです。
> ただし、いわゆる「はしご高」の問題はまた別問題ですので、この処理以外
> に変換テーブルを用意したりしています。
> また、当然ながら送信元のhtmlでは、
>
> <input type="hidden" name="J" value="京">
>
> というようなコードが必要になります。
>
> 検証は不十分な可能性がありますので、利用する場合は注意して下さい。
> 特にJISに関してはあまり試した事がないので要注意です。
上記、丁寧にありがとうございます。
文字コードの判断と変換の部分、よく分かりました。
それにしても他に「はしご高」の問題などもあるとは…。
では、失礼します。
>
>
> _______________________________________________
> PHP-users mailing list PHP-users @ php.gr.jp
> http://ns1.php.gr.jp/mailman/listinfo/php-users
> PHP初心者のためのページ - 質問する前にはこちらをお読みください
> http://www.php.gr.jp/php/novice.php3
----
PHP-users メーリングリストの案内