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

HAYAKAWA Hiroshi php-users@php.gr.jp
Fri, 22 Mar 2002 12:39:27 +0900


早川@名古屋です。

on 02.3.21 2:14 AM, LastTom at lasttom@ra2.so-net.ne.jp wrote:

> 松川です。
> 
>> =?ISO-2022-JP?B?GyRCJDMkbCRPGyhKXBskQiVeITwlLyRIGyhKfhskQiROJUYlOSVIGyhK?=
> 
> をmb_decode_mimeheader() すると確かに?マークになるんですが、
> 「これは\マークと~のテスト」をmb_encode_mimeheader()で変換すると、
> =?ISO-2022-JP?B?GyRCJDMkbCRPGyhCXBskQiVeITwlLyRIGyhCfhskQiROJUYlOSVIGyhC?=
> ですね。
> ちなみにBecky!では
> =?ISO-2022-JP?B?GyRCJDMkbCRPGyhCXBskQiVeITwlLyRIGyhCf
> =?ISO-2022-JP?B?GyRCJE4lRiU5JUgbKEI=?=
> のように変換されて、mb_decode_mimeheader()で変換すると、ちゃんと表示され
> ますね。

Becky!の事例としてあげられているものは途中が切れているかと思いますが、

Microsoft Entourageによる
=?ISO-2022-JP?B?GyRCJDMkbCRPGyhKXBskQiVeITwlLyRIGyhKfhskQiROJUYlOSVIGyhK?=
をデコードして文字コードを見ると、

 033   $   B   $   3   $   l   $   O 033   (   J   \ 033   $   B
   %   ^   !   <   %   /   $   H 033   (   J   ~ 033   $   B   $
   N   %   F   %   9   %   H 033   (   J

同様にmb_encode_mimeheader()による
=?ISO-2022-JP?B?GyRCJDMkbCRPGyhCXBskQiVeITwlLyRIGyhCfhskQiROJUYlOSVIGyhC?=
をデコードして文字コードを見ると、

 033   $   B   $   3   $   l   $   O 033   (   B   \ 033   $   B
   %   ^   !   <   %   /   $   H 033   (   B   ~ 033   $   B   $
   N   %   F   %   9   %   H 033   (   B

となっており、
前者は 0x5c, 0x7e をJIS X 0201-1976の
半角円マークおよび半角オーバーラインとして、
後者は 0x5c, 0x7e をASCIIのbackslashとtildeとして
エンコードしていますね。

ちなみにEntourageのは最後がASCIIで終わってないので不正らしいです。
未確認ですがOutlook Expressでも同じじゃないかと思います。

しかしEUC-JPではそもそも
JIS X 0201-1976の半角円マークと半角オーバーラインは表現できないので、
(ただ、MacやWinの端末窓から日本語フォントを使って表示すると
 半角円マークと半角オーバーラインにみえるはず)
PHP4のマルチバイト変換モジュールは厳密な変換ポリシーによって
?に置き換えているということなんだと思います。

今回いろいろ調べてみて原因(状況)ははっきりしたのですが、
目的の用途に対してはPHP4のマルチバイト変換モジュールによる
JIS->EUC-JP変換は望む動作ではないので、
(変換ポリシーをゆるやかにしてくれるオプション希望)
他の方法にて対応したいと思います。

松川さん、ご協力ありがとうございました。


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