** libmlfl(mbstring)への絵文字のサポート追加
Unicode 6.0に携帯電話の絵文字が正式に組み込まれ、Mac OS Lion等でもサポートされるなど、使う機会も増えてきたということで、mbstringに携帯電話のShift_JIS絵文字コードのサポートを組み込んでみました。
現時点で、githubのlibmbfl開発コード、PHPのHEADおよび5.4ブランチにコミットされていますので、試用することができます。
現時点でサポートされるのは、以下の機能です。
- DoCoMo、KDDI(EzWeb)、SoftBankのShift_JISとUnicode 6.0の相互変換
- DoCoMo、KDDI(EzWeb)、SoftBankのShift_JISとUnicode PUA (Private Use Area)の相互変換
前者がメインの機能ですが、現時点で携帯会社はUTF-8のPUAとの相互変換に基づく運用していますので、レガシー機能のサポートも行っています。
Unicode 6.0を介した絵文字コードの相互変換
複数の携帯電話間の絵文字を含むShift_JISコードの文字コード変換を行います。
Unicodeコンソーシアムが公開するDoCoMo、KDDI、SoftBankのShift_JISコード絵文字とUnicode 6.0との相互変換表に基づき実装されています。
現時点で、Unicode 6.0を直接サポートするシステムは、先日リリースされたLionくらいですが、今後、サポートするOSも増えるものと予想しています。
Unicode 6.0との相互変換が可能とするために、以下の3つの文字コードを追加しています。
- SJIS-Mobile#DOCOMO : DoCoMo絵文字をサポートするShift_JIS
- SJIS-Mobile#KDDI : KDDI絵文字をサポートするShift_JIS
- SJIS-Mobile#SOFTBANK : SoftBank絵文字をサポートするShift_JIS
SoftBank絵文字では、Webコードを含むShift_JISも解釈します。
DoCoMoの絵文字からKDDIの絵文字に変換する例を以下に示します。
echo mb_convert_encoding("\xf8\x9f", "SJIS-Mobile#KDDI", "SJIS-Mobile#DOCOMO");
なお、現時点で対応する絵文字がない場合のフォールバックはサポートされません。ただし、代替文字への置換を行うPHPスクリプトを作成することは比較的容易であると思います。
絵文字は、合字(国旗など)も含めてサポートされますが、Unicode 6.0に含まれない一部の文字(iモードのロゴなど)はサポートされません。
Unicode PUA を介した絵文字の変換
Shift_JIS、UTF-8への相互は現時点でベンダ毎に異なるUnicode PUAとの相互変換としてサポートされています。以下のコードによりShift_JISとUnicode PUAの変換が可能です。
(2011.8.13追記: なお、PUAを介した変換はUnicodeとのマッピングを2種類提供するということで、混乱を発生することになる可能性があります。現在、UTF-8+PUAとUnicode 6.0の間のマッピングを提供し、Shift_JIS からUnicode PUAへのマッピングを提供しないという案とのトレードオフをしています。以下の文字エンコーディングについては、PHP 5.4.0に採用されない可能性がありますので、ご注意ください。)
- SJIS-Mobile#DOCOMO-PUA : DoCoMo絵文字をサポートするShift_JIS
- SJIS-Mobile#KDDI-PUA : KDDI絵文字をサポートするShift_JIS
- SJIS-Mobile#SOFTBANK-PUA : SoftBank絵文字をサポートするShift_JIS
- SJIS-Mobile#KDDI-PUA-B : KDDI絵文字をサポートするShift_JIS (俗称KDDI裏コードを使用)
最後の1つ(SJIS-Mobile#KDDI-PUA-B)は、俗称KDDI裏コードと呼ばれるPUAのマッピングをサポートします。これは、PUAへのマッピングが一部SoftBankの領域と干渉するためです。KDDIの携帯電話は、UTF-8のページで送信してくるデータについてこのコードを使用しているとのことです。
現時点で、各ベンダの規定するPUAを絵文字領域として使用するUTF-8からUnicode 6.0への絵文字領域への変換を直接行う機能はサポートされません。
以下にKDDI絵文字を含む(KDDIが規定するPUA領域マッピングを含む)UTF-8からUnicode 6.0に基づくUTF-8に変換する例を示します。
$sjis = mb_convert_encoding($s, "UTF-8", "SJIS-Mobile#KDDI-PUA", "UTF-8"); echo mb_convert_encoding($sjis, "UTF-8", "SJIS-Mobile#KDDI");