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

Rui Hirokawa rui.hirokawa @ gmail.com
2011年 8月 26日 (金) 23:28:40 JST


廣川です。

> 
> ただ、浅川様が述べられている意見の繰り返しのようになってしまいますが、
> 絵文字を UTF-8-Mobile#xxx でなく、ここでいう UTF-8 に変換しますと、
> Unicode 6.0 で定義されている「似た」絵文字に変換されることになりますので、
> その過程で、元はどのキャリアのどの絵文字であったかという情報が失われます。
> 別の言い方をすると、絵文字を UTF-8 に変換するというのは非可逆な変換です。
> 
> 文字の形が十分似ているのだから問題ない、という考えもあるでしょうし、
> むしろそういった Unicode の考え方に慣れていくべきなのかもしれませんが、
> 後で何か問題が発生することはないだろうか? という不安を若干感じます。

Unicode 6.0の絵文字のコードポイントに変換された時点でもとの
キャリアに関する情報が失われるというのはご指摘の通りです。
例えば、SJISの DoCoMoの"晴れ" \xF8\x9F 、KDDI の \xF6\x60、SoftBankの
\xF9\x8B はともに Unicode 6.0 の U+2600に変換されますが、
変換後の文字(U+2600)を見てもそれがこれらのどのキャリアの文字であったか
はわかりません。ただし、これを例えば、 KDDI 用の SJIS や UTF-8に変換すれ
ば正しく \xF6\x60 (または対応するUTF-8)に変換されます。
したがって、同じキャリアに対してはUnicode 6.0を介しても可逆変換だと
思います。
一方、異なるキャリアに対してはUnicode 6.0が指定するマッピングに基づく対
応する文字に変換されますが、絵文字のデザインはキャリア間で微妙に異なる
ケースが多いので、全く同じ外観の文字になるわけではありません。

> 
> 私が、データ保存用にあと1つ UTF-8-Mobile というエンコーディングもあった
> 方が良いのでは? という提案をしたのは、そういった理由が背景にあります。

前回のメールに書かれた以下のご提案と思いますが、"UTF-8-Mobile"における
マッピングのイメージは、DOCOMO,KDDI(非公式),SOFTBANK絵文字を各キャリアが
使用するPUAに収録するということでしょうか?

これはlibmbflで通常使用するUnicodeを介した変換では、
from と to しか把握しないので、Unicode -> UTF-8-Mobileの変換において
キャリア情報が失われているために、どのキャリアのコードにマッピングして良
いかわからなくなり、困難であるように思います。
Unicodeを介さない直接変換とする場合は、可能なような気がしますので、
少し考えてみようかと思っています。

ただし、以下の例は Docomo、KDDIの絵文字をSoftbank携帯用の絵文字に変換し
て出力する例と思いますが、"UTF-8-Mobile"の部分を"UTF-8"に置き換えるだけ
で、現在の実装でも動作すると思います。

> $sjis_docomo = "\xF8\x9F";
> $sjis_kddi   = "\xF6\x60";
> $utf8  = mb_convert_encoding($sjis_docomo, "UTF-8-Mobile",
> "SJIS-Mobile#DOCOMO");
> $utf8 .= mb_convert_encoding($sjis_kddi, "UTF-8-Mobile", "SJIS-Mobile#KDDI");
> 
> $utf8_softbank = mb_convert_encoding($utf8, "UTF-8-Mobile#SOFTBANK",
> "UTF-8-Mobile");
> 
> のような使い方ができるようになります。

$utf8 にはUnicode 6.0マッピングのUTF-8コードが
入るため、そのままでは各キャリアの絵文字として出力できませんが、

$utf8_softbank = mb_convert_encoding($utf8, "UTF-8Mobile#SOFTBANK","UTF-8");

と各キャリア用のコードに変換して出力すれば問題ないと思います。

典型的なアプリケーションのイメージは、

"SJIS-Mobile#XXXX","UTF-8-Mobile#XXXX"で入力
-> "UTF-8" に変換
-> データベースに保存(UTF-8)
-> データベースから取得(UTF-8)
-> "SJIS-Mobile#XXXX","UTF-8-Mobile#XXXX"に変換して出力

というものです。

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


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