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

HAYAKAWA Hiroshi php-users@php.gr.jp
Mon, 18 Mar 2002 22:18:47 +0900


早川@名古屋です。

on 02.3.18 3:11 PM, LastTom at lasttom@ra2.so-net.ne.jp wrote:

> 松川です。
> 
>> そのプログラム中で文字コードを JIS -> EUC-JP に変換させる際に
>> mb_convert_encoding()を利用していますが、
>> 文字列中に円マーク(\)があるとそれ以降が切れてしまいます。
> 
> 似たような処理を私も行っているのですが、そのような問題は起きておりませ
> ん。(また気付いていないだけかと思いましたが、無事処理されていました。^^;)
> 
> \マーク以降切れているというのはどうやって確認したんですか?
> まさか、データベースに格納したものを、別のスクリプトで表示させブラウザで
> 確認しただけなんてのはないですよねぇ。:)

mb_convert_encoding()の直前直後で、
error_log()を使って指定ファイルに書き出して確認しました。
補足にはなりにくいですが、
mail()やmb_send_mail()で送ってみても、
mb_convert_encoding()の前後で同様の現象になりました。
(DBにINSERTする前にはaddslashes()しています)

 * * *

その後のデバッグで、
「\マーク以降切れる」という現象の原因が、
コマンドライン版のPHPが参照するphp.iniファイルが
意図しないそれを参照していて、入力をSJISとして検出してました。
それを修正してmb_convert_encoding()の前後の文字コードが
それぞれJIS,EUCであることを確認しました。
(mb_detect_encoding()による)

しかし今度は全文は表示されるものの、
円マーク(\)が?マーク(?)になって表示されるという状況になりました。
設定関連のポカかなぁという気もするんですが、
ちょっと思いつかない状況です。
なにかまだ抜けてることがありますでしょうか?

php.iniのマルチバイト関連の設定は以下の通りです。

mbstring.internal_encoding = EUC-JP
;mbstring.http_input = auto
;mbstring.http_output = SJIS
mbstring.detect_order = auto
;mbstring.substitute_character = none;



以下はテストの文面の一例ですが、
この場合、1つ目の円マークはそのまま表示されますが、
2つ目・3つ目の円マークは?マークとして表示されてしまいます。

This is testmail.
\マークのテスト。
'シングル'
"ダブル"
\マークのテスト。
これはテストメールです。
\マークのテスト。
あいうえおかきくけこさしすせそたちつてと


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