** libmlfl(mbstring)への絵文字のサポート追加

Unicode 6.0に携帯電話の絵文字が正式に組み込まれ、Mac OS Lion等でもサポートされるなど、使う機会も増えてきたということで、mbstringに携帯電話のShift_JIS文字コードのサポートを組み込んでみました。

現時点で、githubのlibmbfl開発コード、PHPのHEADおよび5.4ブランチにコミットされていますので、試用することができます。

現時点でサポートされるのは、以下の機能です。

前者がメインの機能ですが、現時点で携帯会社はUTF-8のPUAとの相互変換に基づく運用していますので、レガシー機能のサポートも行っています。

Unicode 6.0を介した絵文字コードの相互変換

複数の携帯電話間の絵文字を含むShift_JISコードの文字コード変換を行います。
Unicodeコンソーシアムが公開するDoCoMoKDDISoftBankShift_JISコード絵文字とUnicode 6.0との相互変換表に基づき実装されています。
現時点で、Unicode 6.0を直接サポートするシステムは、先日リリースされたLionくらいですが、今後、サポートするOSも増えるものと予想しています。

Unicode 6.0との相互変換が可能とするために、以下の3つの文字コードを追加しています。

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_JISUTF-8への相互は現時点でベンダ毎に異なるUnicode PUAとの相互変換としてサポートされています。以下のコードによりShift_JISUnicode PUAの変換が可能です。

(2011.8.13追記: なお、PUAを介した変換はUnicodeとのマッピングを2種類提供するということで、混乱を発生することになる可能性があります。現在、UTF-8+PUAとUnicode 6.0の間のマッピングを提供し、Shift_JIS からUnicode PUAへのマッピングを提供しないという案とのトレードオフをしています。以下の文字エンコーディングについては、PHP 5.4.0に採用されない可能性がありますので、ご注意ください。)

最後の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");

注意

合字の処理などを含むため、現時点でのUnicode 6.0のサポートは実験的なものです。
(国旗のUnicode 入りは政治的にもめたらしいけど、もう少しなんとかならかったのかな。。。)
PHP 5.4.0の正式リリースまでに十分なテストを行う必要があります。