[PHP-users 20194]Re: 文字コードの扱い(ERROR:Invalid EUC_JP)

Youichi Iwakiri yiwakiri @ st.rim.or.jp
2004年 2月 2日 (月) 16:49:55 JST


いわきりです

kenbooit @ excite.co.jp wrote in <20040202153543.6269.h028.c000.wm @ mail.excite.co.jp.criticalpath.net> :
>とあるシステムで以下のようなエラーがたまに吐かれています(エラーハンドラで受信
>)。
> Query failed: ERROR:  Invalid EUC_JP character
>sequence found (0x8b67)

EUC_JPとして無効なキャラクタを発見しました。

>Apacheのアクセスログから該当ログを拾ってきて、
> query=%8Bg%96%EC
>が原因であることが分かりました。
>urldecode関数を使って、
>access_log をaccess_log2にして解析してみたところ、
> query=吉野
>であることが分かったのですが、

それで得られるコードが
 8B67 96EC
  吉   野   (SJIS)

ここまで判っているのならやりようは、いくらでもありませんか。
mb_detect_encoding()で処理対象の文字コードを判別し、
自スクリプト内での文字コードにmb_convert_encoding()を使って
変換すれば、おしまい。


>文字コード絡みでおかしいのは明らかで、
>この変換後のファイルaccess_log2は
>less access_log2 でなら「吉野」とちゃんと表示されるのですが、

jlessあたりだと、コード判別をしてlocaleに併せて表示してくれます。

>view access_log2
>more access_log2
>cat access_log2
>vi access_log2

日本のことなんか考慮していないプログラムなのでそうなるのは
普通です。

>■phpinfo()
>Directive 			Local Value 	Master Value 
>----------------------------------------------------------------
>mbstring.detect_order 		no 		value no value 
>mbstring.encoding_translation 	On 		On 
>mbstring.func_overload 		0 		0 
>mbstring.http_input 		pass 		pass 

外部から与えられるデータは何もせず取り込まれる設定です。

>■php.ini
>[mbstring]
>mbstring.language 		= Japanese
>;mbstring.internal_encoding 	= EUC-JP
>mbstring.encoding_translation 	= On

変換すべき対象が指定されていないので変換は無意味。

>■PostgreSQL
>% psql -l
>        List of databases
>   Name    |  Owner   | Encoding
>-----------+----------+----------
> testdb    | postgres | EUC_JP

そこに、SJISをINSERTまたは、SJISのコードを使用して
SELECT等をすれば、怒られて当然。

>長文、駄文、的外れな知識もありまして、大変恐縮ですが、
>ご指導の程よろしくお願い致します。

マニュアルを精読しましょう。

-- 
Youichi Iwakiri



PHP-users メーリングリストの案内