mbstring/libmbfl モバイル用UTF-8

Unicode 6.0 <-> モバイル用UTF-8の相互変換を可能としました。実際のコードをテストするには、github.com のlibmbfl のレポジトリか、svn.php.netからPHP 5.4または5.5の開発用ソースコードを取得ください。

以下、仕様等について記述します。

UTF-8-Mobileの必要性

UTF-8に関しては、現状でキャリア毎に異なるマッピングでPUA領域に絵文字が設定されています。
また、Unicode数値エンティティについてもPUA領域にマップされることが前提の仕様となっています。

前稿で、Shift_JISからUnicode PUAへのマッピングをレガシー(現状?)サポートとして作成しましたが、Unicode 6.0をベースにしたシンプルな実装を目標とすると、Shift_JISからUnicodeへのマップが2通りある(Unicode PUAとUnicode 6.0)のは混乱を招くような気がします。

Unicodeを直接使用するのは、数値エンティティの時くらいと考えると、Shift_JISからUnicode PUAへのマッピングを作るよりも、Unicode <-> UTF-8マッピングでモバイル用UTF-8を定義する方が混乱が少ない気がします。この場合、UnicodeマッピングUnicode 6.0ベースのものだけとなり、各フィルタはUnicode 6.0との相互変換を定義するというlibmbflの他のフィルタと同じ動きとなります。

UTF-8-Mobileの追加

以下のモバイル用UTF-8を定義し、Unicode 6.0との相互変換を可能とします。

- UTF-8-Mobile#DOCOMO : DoCoMo定義のUnicode PUAに基づくUTF-8
- UTF-8-Mobile#SOFTBANK: SoftBank定義のUnicode PUAに基づくUTF-8
- UTF-8-Mobile#KDDI : KDDI定義のUnicode PUAに基づくUTF-8
- UTF-8-Mobile#KDDI-B : KDDI定義のUnicode PUAに基づくUTF-8 (通称:裏KDDIコード)

UTF-8Shift_JIS間の変換はSJIS-Mobile#DOCOMO-PUA経由の時よりも以下のようにすっきり書けます。

$utf8 = mb_convert_encoding($sjis, "UTF-8-Mobile#DoCoMo", "SJIS-Mobile#DoCoMo");

なお、KDDIについては、UTF-8のページではフォーム送信時に裏KDDIコードを使用するとのことなので、むしろ、UTF-8-Mobile#KDDI-Bの方が本命なのかもしれません。

この辺の仕様については、もう少し議論が必要かもしれません。

SJIS-Mobile#*-PUAについては、混乱を避けるために、Unicode数値エンティティのサポート等で不都合がなければ基本的に削除しても良いかと思っています。(この辺はコメントいただければと思います。)

注意

ベンダのロゴ等、Unicode 6.0に収録されていない文字はサポートされません。
具体的には、Shift_JISで以下のコードの文字はサポートされません。

- DoCoMo: F975,F976,F978,F979,F984,F986,F9B1,F9B2
- KDDI: F370,F478,F486,F748,F794,F7A3,F7CF,F7D2
- SoftBank: F7B1, FBAA

絵文字領域以外の文字の変換は、通常の Unicode <-> UTF-8 の変換と同じにしています。

上記のUnicode 6.0で定義されない文字を除きマッピングの動作を確認していますが、
例外処理等の確認は十分ではないため、PHP 5.4.0 の正式リリースまでに十分な確認が必要です。