[PHP-users 6256] mb_convert_encoding() でのJIS->EUC-JP変換

HAYAKAWA Hiroshi php-users@php.gr.jp
Sun, 17 Mar 2002 18:45:23 +0900


早川@名古屋です。

PHP4.1.2のコマンドライン版にて、
受信メールを処理させるプログラムを書いています。
(当該プログラムはPostfixが起動します)

そのプログラム中で文字コードを JIS -> EUC-JP に変換させる際に
mb_convert_encoding()を利用していますが、
文字列中に円マーク(\)があるとそれ以降が切れてしまいます。
例えばこのメールを処理させると、
2つ上の行の閉じ括弧以降がなくなってしまうのです。

ただしそれはメールの本文に日本語が含まれる場合のみで、
メールの本文がUS-ASCIIの場合は問題ありません。

この挙動が正しいのかどうかを判断するだけの知識はないのですが、
正しいとしてもこれでは困ってしまうので
なんらかの回避策を考えなければいけません。

この問題に遭遇された方はいらっしゃらないでしょうか?
ポカだったりすると少々お恥ずかしいですけども。



プログラムは下記のようになっています。
文字コードの変換時にはヘッダも含めたソース全部が対象です。
(改行コードは文字コードの変換の後に変換しています)

一応記しておきますと読込時点ではクエリエスケープはされておらず、
後ほど行なうDBへのINSERT直前にaddslashes()しています。

----------

// メールの本体(ヘッダも含む)
$rawmail="";
$fp=fopen("php://stdin", "r");
while(!feof($fp)){
    $rawmail.=fread($fp, 4096);
}
fclose($fp);

// 文字コードの変換(JIS -> EUC-JP)
$rawmail=mb_convert_encoding($rawmail, "EUC-JP", "JIS");
// JISの部分をautoにしても現象は再現される

----------

コンパイルオプションは以下の通りです。

$ ./configure --with-apxs=/usr/sbin/apxs -with-config-file-path=/etc/httpd
--with-pgsql=/usr --without-mysql --enable-track-vars --enable-versioning
--enable-trans-sid --enable-mbregex --enable-mbstring
--enable-mbstr-enc-trans


-----
>>>  With your dreaming,           ☆彡  Hayakawa,Hiroshi          <<<
>>>          with your smile.    ☆彡    hayakawa@sam.hi-ho.ne.jp  <<<
>>>                            ☆彡      Nagoya,Aichi,JAPAN        <<<