share facebook facebook twitter menu hatena pocket slack

2012.02.15 WED

PHPで外字を含む文字列のエンコードコンバート

櫛田 草平

WRITTEN BY 櫛田 草平

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

最近の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)が書いています。

櫛田 草平

櫛田 草平

cloudpackで運用、保守、構築、夜間対応を担当しており、日々様々な課題に対応していますのでこの経験を記事にしていけたらと思います。 櫛田 草平

cloudpack

cloudpackは、Amazon EC2やAmazon S3をはじめとするAWSの各種プロダクトを利用する際の、導入・設計から運用保守を含んだフルマネージドのサービスを提供し、バックアップや24時間365日の監視/障害対応、技術的な問い合わせに対するサポートなどを行っております。
AWS上のインフラ構築およびAWSを活用したシステム開発など、案件のご相談はcloudpack.jpよりご連絡ください。