こんにちは。
職人見習いの高嶋です。

最近のWebコンテンツはUTF-8で作成される事が多くなり、別の文字コードにコンバートするケースが徐々に減ってきています。
しかし、それでもコンテンツ内のメール配信時にはまだまだUTF-8のまま送信するのは、配信先メーラーが対応しているかという点で抵抗があるので、ISO-2022-JPにコンバートする必要があります。

その際にどうしても問題となってくるのが外字です。
『﨑』『髙』等、氏名や組織名に使われている事も多く、『崎』『高』に替えたいところですが名前は命という事でこういう対処法は時として受け容れてもらえない事もあります。

文字コードがUTF-8で一貫していれば、最近のPCやスマホでは表示することができますが、メール送信時に下記のようにしてISO-2022-JPに変換すると文字化けしてしまいます。

$str = mb_convert_encoding( $str, 'ISO-2022-JP');

しかし、PHP V5.2.1以降では『iso-2022-jp-ms』というエンコーディングが追加され、このエンコーディングでサポートされている文字も変換する事が可能になりました。

$str = mb_convert_encoding( $str, 'ISO-2022-JP-MS');

これにより、$strに(サポートされている)外字が含まれていても、正常にコンバートすることが出来ます。

但し、文字エンコードを正しくコンバート出来る事と、端末で外字を表示出来る事はイコールではありません。

いくら正常にコンバートしても、表示先の端末にその外字がサポートされていなければ表示されません。

そこで、以下のテストを行ってみました。

$str = '髙嶋裕明';
$str = mb_convert_encoding( $str, 'ISO-2022-JP-MS');

これを以下の条件で表示してみると以下の結果になりました。

Windows + Thunderbird 正常に表示
Windows + Outlook 正常に表示
Mac + Mail 正常に表示
iPhone + Gmail 正常に表示
iPhone + SMS 『髙』が抜けて表示
携帯端末Mail 『髙』が抜けて表示

因みに、昔の携帯端末のWeb画面の場合、Shift_JISに変換しなければなりませんが、この文字コードもコンバートは正常に変換出来ても、端末自体に文字が対応していないので表示されないという結果になりました。

以上のことから、人名や組織名を扱うプログラムを組む際は、事前にクライアントに対して外字の対応を決めておく必要があります。

対応としては、下記の2択になるかと思います。

  • 一部端末が非表示を承知の上で外字OKとするか。
  • 全端末で見えないと問題なので簡易漢字に変換もしくは外字入力を受け付けないようにするか。

※この記事は、なかの人(piro556)が書いています。