[PHP-users 20193]文字コードの扱い(ERROR: Invalid EUC_JP)
kenbooit @ excite.co.jp
kenbooit @ excite.co.jp
2004年 2月 2日 (月) 15:35:42 JST
お世話になってます。
島田と申します。
文字コードに関する質問です。
環境:FreeBSD4.7
Apache1.3.27
PostgreSQL7.2.3
MLには既出テーマで色々と参考にさせて頂いたのですが、
改めて質問させて頂きます。
とあるシステムで以下のようなエラーがたまに吐かれています(エラーハンドラで受信)。
Query failed: ERROR: Invalid EUC_JP character
sequence found (0x8b67)
$rs = pg_exec($db_con,$sql) or die ("SQL
error:$sql"); ##昔のなのでpg_queryになってないですが
上記のようにWEBフォームにキーワードを入力し、DB内を検索するというものなのですが、
Apacheのアクセスログから該当ログを拾ってきて、
query=%8Bg%96%EC
が原因であることが分かりました。
urldecode関数を使って、
access_log をaccess_log2にして解析してみたところ、
query=吉野
であることが分かったのですが、
文字コード絡みでおかしいのは明らかで、
この変換後のファイルaccess_log2は
less access_log2 でなら「吉野」とちゃんと表示されるのですが、
view access_log2
more access_log2
cat access_log2
vi access_log2
などとして見ると、
この行だけ化けています。
いずれも「跛」という文字が含まれて表示されます。
# この部分はほとんどUnixな話?で申し訳ありません。
以下開発環境における文字コードに関する情報です。
■WEBフォームの出力文字コード:多分EUC-JP
出力するHTMLには全て以下のMETAタグを記載しています。
<META http-equiv="Content-Type" content="text/html;
charset=EUC-JP">
ただし、
telnet hogehoge 80
head / http/1.0
で返ってくるのは
Content-Type: text/html;
なので「多分」と言ってしまいました。
(今はApacheのConfigで
AddDefaultCharset EUC-JP を加えて、
Content-Type: text/html; charset=EUC-JP
が返ってくるようにしようかなとも考えています。)
■PHPスクリプトの文字コード
EUC-JP
■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
mbstring.http_output pass pass
mbstring.internal_encoding none none
mbstring.language Japanese Japanese
mbstring.substitute_character no value no value
■php.ini
[mbstring]
mbstring.language = Japanese
;mbstring.internal_encoding = EUC-JP
;mbstring.http_input = auto
;mbstring.http_output = SJIS
mbstring.encoding_translation = On
;mbstring.detect_order = auto
;mbstring.substitute_character = none;
;mbstring.func_overload = 0
■PostgreSQL
% psql -l
List of databases
Name | Owner | Encoding
-----------+----------+----------
testdb | postgres | EUC_JP
php.iniは現状あえて
mbstring.internal_encoding = EUC-JP
mbstring.http_input = EUC-JP
mbstring.http_output = EUC-JP
とはしていません。
過去ログを見る限りSJISがこの辺りに入っていたりすると、
どうしてSJIS?みたいな発言もあったような気がしたのですが、
(意味を解釈し間違っていたらすみません。検索したのですがみつけることができませんでした)
現実WEBにアクセスしてくるユーザーはほとんどがWindows端末で、
例えば「高橋」の高の「口」の部分がハシゴみたいに繋がっている奴が、
パソコンによっては入力することが可能で、
以前これがWEBに表示されなくて、ハマッタ記憶があります(データは\copyコマンドでCSVから入れました)。
(その時はとりあえず「口」の「高」に直して逃げちゃいました。)
要するにまだ文字コード処理が良く分かっていないので、
設定を変更していない、という状況です。
長文、駄文、的外れな知識もありまして、大変恐縮ですが、
ご指導の程よろしくお願い致します。
PHP-users メーリングリストの案内