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