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