[PHP-dev 1520] Re: 絵文字 <-> Unicode 6.0 変換

Rui Hirokawa rui.hirokawa @ gmail.com
2011年 8月 24日 (水) 20:43:33 JST


廣川です。

> 
> $utf8_docomo = mb_convert_encoding("\xF8\x9F", "UTF-8", "SJIS-Mobile#DOCOMO");
> $utf8_kddi = mb_convert_encoding("\xF6\x60", "UTF-8", "SJIS-Mobile#KDDI");
> $sjis_softbank = mb_convert_encoding("\xEE\x98\xBE",
> "SJIS-Mobile#SOFTBANK", "UTF-8");
> 
> このように、変換元、変換先のエンコーディングとして UTF-8 を指定した場合は、
> 正しい変換結果が得られないようです。

「正しい変換」の解釈が異なるのかもしれませんが、汎用のUTF-8を指定してい
る以上、これは仕様でありUnicodeとUTF-8の変換としては正しい動作です。

例えば、最初の行は、

SJIS-Mobile#DOCOMO -> Unicode -> UTF-8

という変換となります。

前半の変換の際に、Shift_JISの外字エリアにある絵文字コードが
Unicode 6.0の絵文字のコードに変換されます。

後半の変換において、
UTF-8はUnicode (6.0) の文字空間を単にフォーマット変換しただけですから、
Unicodeの文字コードとUTF-8は1対1に対応します。
Unicode 6.0の絵文字のコードがUTF-8に変換されて出力され、出力は
正しいUnicode 6.0の絵文字となります。
(ただし、もちろんDoComo用絵文字UTF-8としては正しくありません)

UTF-8の形式でDOCOMO用の絵文字を出力したい場合、
Unicode 6.0の本来のコードをUnicodeのPUAのDoCoMoの絵文字エリア
に変換する必要があります。
前記のようにこのようなマッピング処理をUnicode <-> UTF-8で
行うことはありませんので、通常のUTF-8ではなくPUAに関して特殊な専用の処理
を行うUTF-8であるUTF-8-Mobile#DOCOMOを定義する必要があるわけです。

別の選択肢としては、従来行われているようにShift_JISの絵文字領域を
Unicode 6.0の絵文字領域ではなく Unicode の携帯電話用の UTF-8 で使用され
ている PUA と相互変換することで、汎用のUTF-8との間に相互変換が可能と
なります。

SJIS-Mobile#DOCOMO-PUA -> Unicode(PUA) -> UTF-8

これは、最初に作った下位互換用の SJIS-Mobile#KDDI-PUA などというものに
相当します(現在は使えなくしていますが、復活も可能です)。
ただし、Unicode 6.0を介した統一された変換をサポートするというのが本来の
趣旨ですので、このような変換をサポートすると将来的にも混乱をまねくかと
思っています。

-- 
Rui Hirokawa <rui.hirokawa @ gmail.com> (@rui_hi)


PHP-dev メーリングリストの案内