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() で定義された値が用いられていました。

とありますが。