mb_convert_encodingのJISとISO-2022-JP
知り合いが勤めている会社が運営するASPサービスの機能追加や保守をお手伝いする仕事が最近入りまして、ちょっとバタバタしていました。ら、ブログの投稿間隔が結構空いてしまいましたね。
そのASPサービスは主にPHPで作成されているのですが、そのサービスの要改善点の一つに、機種依存文字が含まれたテキストをメール送信した際に機種依存文字が文字化けするという、まぁありがちな問題が含まれていたので、ちょっと調べてみて見つけた記事です。
れぶろぐ – [PHP] mb_convert_encoding 関数の ISO-2022-JP と JIS の違い
mb_convert_encoding() 関数でエンコーディングを指定する際、ISO-2022-JP と JIS では意味が違うというのはご存知でしょうか? PHP のソースコード (mbfilter_jis.c) を見てみると、それぞれのエンコーディングが対応する文字種は、次のようになっています。
- ISO-2022-JP
- ASCII
- JIS X 0201 ラテン文字
- JIS X 0208
- JIS
- ASCII
- JIS X 0201 ラテン文字
- JIS X 0201 半角カナ
- JIS X 0208
- JIS X 0212
要するに、JIS は半角カナに対応していますが、ISO-2022-JP は対応していません。そのため、半角カナのメールを扱うという無茶なことをやりたい時には、ISO-2022-JP でなく JIS を指定すると良いようです。
この結果は、自分でもWin+PHP5.2.13で確認できました。ちなみに問題のASPが動いているLinux+PHP5.2.0と同環境でも同じテストコードで確認してみたのですが、こちらでは表示結果は変わらなかったので、PHP5.2.1以降に含まれるようになったISO-2022-JP-MSの影響があるのかなぁ、と。
あと、最近PHPでメール送信で mb_send_mail は使わないのがスタンダードのようですが、PHP: mb_language – Manualによると
言語とその設定は、Japanese の場合は ISO-2022-JP/Base64、uni の場合は UTF-8/Base64、English の場合は ISO-8859-1/quoted printable です。
と、どうもISO-2022-JPに変換してメール送信しちゃうように読めるので面倒ですね。ただ同じくマニュアルからPHP: mb_send_mail – Manualの記載には、
PHP 5.0.0 以降では、Content-Type および Content-Transfer-Encoding ヘッダの内容が 再定義可能となりました。PHP 4 では、常に mb_language() で定義された値が用いられていました。
とありますが。