[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 メーリングリストの案内