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

classic Classic list List threaded Threaded
11 messages Options
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

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

revulo
村松と申します。

HTML_Emoji という PHP の絵文字ライブラリを作って公開しているので、
その時の経験から意見を述べさせていただきます。

以下のコメントは、
http://d.hatena.ne.jp/rui_hi/20110813/1313242399
に書かれている、現時点での仕様に対するものですので、
そちらも合わせてご参照下さい。

なお、申し訳ないのですが、時間の都合もありまして、
まだ実際にソースコードを見たり、テストしたりはしておりません。
考えに誤りがあるかもしれませんので、参考意見くらいに捉えて下さい。

ユーザーの視点から見た仕様としては、上記のページに書かれているように、

・UTF-8-Mobile#xxx を新たに定義する
・SJIS-Mobile#xxx-PUA は SJIS-Mobile#xxx に統合する

のようにするのが、すっきりとして妥当だと思います。
エンコーディング名は、Ruby 1.9.2 以降のように、UTF-8-docomo, SJIS-docomo
のような名前にしても良いのかもしれません。

ただ、現在の実装は、

UTF-8 ←→ UTF-8-Mobile
UTF-8 ←→ SJIS-Mobile

のように Unicode 6.0 とのマッピングを用意しようとしているのだと思いますが、
そのようにすると、UTF-8-Mobile と SJIS-Mobile との間で変換をした時に、
一部の絵文字が破壊されてしまうのではないでしょうか?
ですので、UTF-8-Mobile と SJIS-Mobile との間の変換については、

UTF-8 ←→ UTF-8-Mobile ←→ SJIS-Mobile

のように、Unicode 6.0 を介さずに処理する方が良いのではないかと思うのですが、
いかがでしょうか? ご検討いただけると幸いです。

以上、よろしくお願い致します。

--
Shinya Muramatsu <[hidden email]>
_______________________________________________
PHP-dev mailing list
[hidden email]
http://ml.php.gr.jp/mailman/listinfo/php-dev
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

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

Rui Hirokawa-3
廣川です。

コメントありがとうございます。

> UTF-8 ←→ UTF-8-Mobile
> UTF-8 ←→ SJIS-Mobile

の部分の解釈が少し異なるようです。

libmbfl のコード変換はUnicodeに対する相互変換の
実装となっており、この部分は、

Unicode 6.0 <-> UTF-8-Mobile
Unicode 6.0 <-> SJIS-Mobile

のように実装されています。(UTF-8との相互変換ではない)

通常のUnicode と UTF-8 の間の変換は算術変換で定義されるにも
かかわらず、上記の変換では、UTF-8-Mobile 上ではPUA領域にある絵文字を
Unicode 6.0の絵文字領域に変換するため、少しわかりにくいの
ですが、Unicode とのマッピングが1種類ですむという意味では
わかりやすいのではと思います。

例えば、UTF-8-Mobile#KDDI から SJIS-Mobile#DoCoMoへの
変換は、

UTF-8-Mobile#KDDI -> Unicode 6.0 -> SJIS-Mobile#DoCoMo

のように内部的に行われます。

この過程で相互にマッピングが定義されない文字については
代替文字に置き換わりますが、対応するマッピングがある文字については
失われることはないのではと思います。

下記、一部の文字というのは何か具体的な文字を想定されているのでしょうか?

> ですので、UTF-8-Mobile と SJIS-Mobile との間の変換については、
>
> UTF-8 ←→ UTF-8-Mobile ←→ SJIS-Mobile
>
> のように、Unicode 6.0 を介さずに処理する方が良いのではないかと思うのですが、
> いかがでしょうか? ご検討いただけると幸いです。

UTF-8 <-> UTF-8-Mobile の部分がよくわからないのですが、
ここで想定している変換はどのようなものでしょうか?

UTF-8-Mobile は形式上は通常のUTF-8と同じで、単に
PUAのマッピングが各キャリア対応になっているだけのものですので、
PUAのマッピングを変更することになりますが、具体的なアイデアを
思いつきません。

UTF-8-Mobile <-> SJIS-Mobile

の変換自体は、実際には比較的容易に算術変換で変換できるのですが、
Unicodeを介することでいろいろな組み合わせを実現するlibmbflの
実装との整合性や将来性を考えると、Unicode 6.0 を介する方が
良いかと考えています。


(2011年08月19日 01:30), Shinya Muramatsu wrote:

> 村松と申します。
>
> HTML_Emoji という PHP の絵文字ライブラリを作って公開しているので、
> その時の経験から意見を述べさせていただきます。
>
> 以下のコメントは、
> http://d.hatena.ne.jp/rui_hi/20110813/1313242399
> に書かれている、現時点での仕様に対するものですので、
> そちらも合わせてご参照下さい。
>
> なお、申し訳ないのですが、時間の都合もありまして、
> まだ実際にソースコードを見たり、テストしたりはしておりません。
> 考えに誤りがあるかもしれませんので、参考意見くらいに捉えて下さい。
>
> ユーザーの視点から見た仕様としては、上記のページに書かれているように、
>
> ・UTF-8-Mobile#xxx を新たに定義する
> ・SJIS-Mobile#xxx-PUA は SJIS-Mobile#xxx に統合する
>
> のようにするのが、すっきりとして妥当だと思います。
> エンコーディング名は、Ruby 1.9.2 以降のように、UTF-8-docomo, SJIS-docomo
> のような名前にしても良いのかもしれません。
>
> ただ、現在の実装は、
>
> UTF-8 ←→ UTF-8-Mobile
> UTF-8 ←→ SJIS-Mobile
>
> のように Unicode 6.0 とのマッピングを用意しようとしているのだと思いますが、
> そのようにすると、UTF-8-Mobile と SJIS-Mobile との間で変換をした時に、
> 一部の絵文字が破壊されてしまうのではないでしょうか?
> ですので、UTF-8-Mobile と SJIS-Mobile との間の変換については、
>
> UTF-8 ←→ UTF-8-Mobile ←→ SJIS-Mobile
>
> のように、Unicode 6.0 を介さずに処理する方が良いのではないかと思うのですが、
> いかがでしょうか? ご検討いただけると幸いです。
>
> 以上、よろしくお願い致します。
>
> --
> Shinya Muramatsu<[hidden email]>
> _______________________________________________
> PHP-dev mailing list
> [hidden email]
> http://ml.php.gr.jp/mailman/listinfo/php-dev


--
Rui Hirokawa <[hidden email]> (@rui_hi)
_______________________________________________
PHP-dev mailing list
[hidden email]
http://ml.php.gr.jp/mailman/listinfo/php-dev
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

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

revulo
村松です。

すみません。私が誤解をしていた部分がありました。

> UTF-8 ←→ UTF-8-Mobile
> UTF-8 ←→ SJIS-Mobile
> UTF-8 ←→ UTF-8-Mobile ←→ SJIS-Mobile

これらの UTF-8 と書かれていた部分は、Unicode 6.0 と読み替えて下さい。


> 下記、一部の文字というのは何か具体的な文字を想定されているのでしょうか?

具体的には、http://d.hatena.ne.jp/rui_hi/20110813/1313242399 の注意に
書かれているベンダのロゴ等の文字です。
PHP 5.4 dev で以下のコードを実行してみましたが、やはり期待とは異なる答えが
得られました。

$sjis = "\xF9\x75";
$utf8 = mb_convert_encoding($sjis, "UTF-8-Mobile#DOCOMO", "SJIS-Mobile#DOCOMO");

Unicode 6.0 を介した方が、内部的にきれいにまとまることは理解しておりますが、
上記の動作が仕様となってしまうのは、少し残念に思います。


もう1点、気付いた点があります。
例えば、Wiki や掲示板で絵文字を使うケースを想像していただきたいのですが、
現在の仕様ですと、3キャリアの絵文字が混在したデータを扱うことができません。
また、http://d.hatena.ne.jp/rui_hi/20110821/1313905393 に書かれているように、
KDDI の公式マッピングに基づいた UTF-8 は、使い物になりません。

そこで、あくまでも1つの案としてですが、

UTF-8-Mobile#DOCOMO
UTF-8-Mobile#KDDI-B
UTF-8-Mobile#SOFTBANK

この3つは絵文字の領域に重なりがないのですが、これらを統合したような、
UTF-8-Mobile というエンコーディングを新設することは可能でしょうか?
そうすれば、絵文字混じりのデータをデータベース等に保存する際には、
UTF-8-Mobile に変換すれば済むことになります。
つまり、

$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");

のような使い方ができるようになります。

--
Shinya Muramatsu <[hidden email]>
_______________________________________________
PHP-dev mailing list
[hidden email]
http://ml.php.gr.jp/mailman/listinfo/php-dev
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

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

Rui Hirokawa-3
廣川です。

(2011年08月22日 06:21), Shinya Muramatsu wrote:

> 村松です。
>
> すみません。私が誤解をしていた部分がありました。
>
>> UTF-8 ←→ UTF-8-Mobile
>> UTF-8 ←→ SJIS-Mobile
>> UTF-8 ←→ UTF-8-Mobile ←→ SJIS-Mobile
>
> これらの UTF-8 と書かれていた部分は、Unicode 6.0 と読み替えて下さい。
>
>
>> 下記、一部の文字というのは何か具体的な文字を想定されているのでしょうか?
>
> 具体的には、http://d.hatena.ne.jp/rui_hi/20110813/1313242399 の注意に
> 書かれているベンダのロゴ等の文字です。
> PHP 5.4 dev で以下のコードを実行してみましたが、やはり期待とは異なる答えが
> 得られました。
>
> $sjis = "\xF9\x75";
> $utf8 = mb_convert_encoding($sjis, "UTF-8-Mobile#DOCOMO", "SJIS-Mobile#DOCOMO");
>
> Unicode 6.0 を介した方が、内部的にきれいにまとまることは理解しておりますが、
> 上記の動作が仕様となってしまうのは、少し残念に思います。

ベンダのロゴはUnicode 6.0から外されてしまっているのであまりサポートする
気がありませんでした。個人的に 109(マルキュー)とかはある意味日本の
カルチャーだと思いますので、入れてくれてもよかったのにと思いますが。。。
これらの文字は、私用域にマッピングするしかありません。
BMPの私用域にマッピングするのでも良いのですが、ここはすでに混んでいて他
と干渉する可能性があります。
ということで、私用面(PMP)を利用するGoogleのコード(emoji4unicodeで利用
されている)が良いような気がします。
Unicode 6.0 とのマッピングを追加するようにしてみます。

>
>
> もう1点、気付いた点があります。
> 例えば、Wiki や掲示板で絵文字を使うケースを想像していただきたいのですが、
> 現在の仕様ですと、3キャリアの絵文字が混在したデータを扱うことができません。
> また、http://d.hatena.ne.jp/rui_hi/20110821/1313905393 に書かれているように、
> KDDI の公式マッピングに基づいた UTF-8 は、使い物になりません。
>
> そこで、あくまでも1つの案としてですが、
>
> UTF-8-Mobile#DOCOMO
> UTF-8-Mobile#KDDI-B
> UTF-8-Mobile#SOFTBANK
>
> この3つは絵文字の領域に重なりがないのですが、これらを統合したような、
> UTF-8-Mobile というエンコーディングを新設することは可能でしょうか?
> そうすれば、絵文字混じりのデータをデータベース等に保存する際には、
> UTF-8-Mobile に変換すれば済むことになります。

少し意味がわからないのですが、
Unicode 6.0のマッピング可能な絵文字はUnicodeの文字空間として
統合されており、通常のUTF-8としてデータベースに保存・取得することが
できます。

下記の例は、以下のようなシンプルなコードで実現できます。

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


--
Rui Hirokawa <[hidden email]> (@rui_hi)
_______________________________________________
PHP-dev mailing list
[hidden email]
http://ml.php.gr.jp/mailman/listinfo/php-dev
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

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

revulo
村松です。

> 下記の例は、以下のようなシンプルなコードで実現できます。
>
> $utf8  = mb_convert_encoding("\xF8\x9F", "UTF-8", "SJIS-Mobile#DOCOMO");
> $utf8 .= mb_convert_encoding("\xF6\x60", "UTF-8", "SJIS-Mobile#KDDI");
> $utf8_sb = mb_convert_encoding($utf8, "SJIS-Mobile#SOFTBANK","UTF-8");

エンコーディングに UTF-8 を指定した場合も絵文字が扱えるのであれば、
それで良いのですが、現状はそうなっていないようです。

$utf8_docomo = mb_convert_encoding("\xF8\x9F", "UTF-8-Mobile#DOCOMO",
"SJIS-Mobile#DOCOMO");
$utf8_kddi = mb_convert_encoding("\xF6\x60", "UTF-8-Mobile#KDDI-B",
"SJIS-Mobile#KDDI");
$sjis_softbank = mb_convert_encoding("\xEE\x98\xBE",
"SJIS-Mobile#SOFTBANK", "UTF-8-Mobile#DOCOMO");

このように、UTF-8-Mobile#xxx, SJIS-Mobile#xxx 間での変換を指定した場合は、
正しい答えが返ってくるのですが、

$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 を指定した場合は、
正しい変換結果が得られないようです。

お手数ですが、ご確認いただけますでしょうか?

--
Shinya Muramatsu <[hidden email]>
_______________________________________________
PHP-dev mailing list
[hidden email]
http://ml.php.gr.jp/mailman/listinfo/php-dev
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

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

Rui Hirokawa-3
廣川です。

>
> $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 <[hidden email]> (@rui_hi)
_______________________________________________
PHP-dev mailing list
[hidden email]
http://ml.php.gr.jp/mailman/listinfo/php-dev
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

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

Tomoyuki Asakawa
あさかわです。

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




廣川さんのおっしゃるというか、文字変換のシステムを作成してくれる開発者の思想として正しい動作だと思います。

しかし、絵文字を必要とするニーズとしては。

ドコモの絵文字を格納してドコモで表示
AUの絵文字を格納してAUで表示
SBの絵文字を格納してSBで表示

する時に、欠落なく元と同じ文字で表示される事はもちろん。

PC上で、ドコモ,AU,SBの絵文字を表示する時にフォントとして存在しない文字を表示する場合に画像を利用したりしますが。その場合に、対応するコードポイントが保持されていないとそれもできない事になります。

PCではなくても、AUの絵文字の入っているデータを、ドコモで表示する時にも、表示できない文字は画像を利用するなどの対応が必要な時もありますので、表示できない文字を欠落させられるとそれができません。

すると、データとして格納する時は、キャリア別のコードのまま格納して、出力で対応する事になり
せっかくつくっていただいた、機能を利用できない事になってしまいます。

そういうケースがレアかレアじやないかというのは、その人のおかれる立場で違います。

HTML_Emoji という PHP の絵文字ライブラリを作って公開してくれている村松様のご意見は、
そのレアじゃない立場を代表してくれています。

じゃそういう人はHTML_Emojiを使えばよいじゃないかと言う意見もあるでしょうが,
村松様がご意見を述べられているという事は、自分のライブラリが不要になってでも
PHPの本体に機能が追加される事を望んでいるのだとおもいます。

そのためには、すくなくとも。HTML_Emoji利用と同等になっていて欲しいと思います。


[Unicode 6.0を介した統一された変換をサポートする]

という趣旨で、Unicode 6.0で定義できない文字を,変換側で排除することで、特別な対応なくどのブラウザでも
同じ文字が表現できるというメリットがあります。

しかし、Unicode 6.0で定義できない文字を,変換側で排除されてしまうと特別な処理を必要とするシステムでは作成できない事になります。

現状でも、PHPにかぎらず。ISO-2022では無いということで半角カナを捨てるライブラリがあったりしますが
そういう場合は、半角仮名を許容したい場合には使えないわけです。

こういう立場もあることをご理解ください。

PUAへのマッピングを、プログラマが再定義できる様になっているとかでも良いと思います。

ワールドワイドな統一思想からは明らかに逸脱した、狭い世界のニーズなので、
簡単には使えないのでもかまわないと思います。でもできないのが困ります。










_______________________________________________
PHP-dev mailing list
[hidden email]
http://ml.php.gr.jp/mailman/listinfo/php-dev
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

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

revulo
村松です。

まず初めに、「正しい変換」という私の表現は適切ではありませんでした。
私が予想していたのとは異なる変換結果が返ってきたと書くべきでした。
申し訳ございません。

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

つまり、UTF-8 というエンコーディングを変換先に指定した場合には、
Unicode 6.0 のコードを機械的に変換した値が返ってくるということですね。
その点については了解しました。
その動作は私も納得がいきますし、そういう動作であるべきだと思います。

ただ、浅川様が述べられている意見の繰り返しのようになってしまいますが、
絵文字を UTF-8-Mobile#xxx でなく、ここでいう UTF-8 に変換しますと、
Unicode 6.0 で定義されている「似た」絵文字に変換されることになりますので、
その過程で、元はどのキャリアのどの絵文字であったかという情報が失われます。
別の言い方をすると、絵文字を UTF-8 に変換するというのは非可逆な変換です。

文字の形が十分似ているのだから問題ない、という考えもあるでしょうし、
むしろそういった Unicode の考え方に慣れていくべきなのかもしれませんが、
後で何か問題が発生することはないだろうか? という不安を若干感じます。

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

--
Shinya Muramatsu <[hidden email]>
_______________________________________________
PHP-dev mailing list
[hidden email]
http://ml.php.gr.jp/mailman/listinfo/php-dev
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

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

Rui Hirokawa-3
In reply to this post by Tomoyuki Asakawa
廣川です。

まず村松さんも含めて基本的なニーズの認識は私とあまり違いはないのではと
思います。

必須だと思っているのは、あさかわさんの書かれている内容とほぼ同じで、
以下の機能です。

1.キャリアAの絵文字は格納した後、キャリアAに対して同じ文字として表示
 できること。(可逆であること)
2.異なるキャリアの絵文字はキャリアAから格納後、キャリアBで表示した際に
 少なくとも欠落せず、固定したコードポイントを得ることができること。
 (対応する文字がない場合でもフォールバック機能を作成できること。)
3.キャリアAの絵文字をUnicode 6.0に格納後、キャリアBに出力する際に
 対応する絵文字がUnicode 6.0のマッピングに定義されている場合は、
 キャリアBの対応する絵文字として出力可能なこと。
 

1は当前のニーズで、Unicode 6.0に含まれない文字(iモードのロゴなど)が
問題となりますが、Googleが提案したコードのマッピングを利用する実装を
昨晩コミットしましたので、現時点でsvn.php.netから取得できるコードでは
キャリアが公開する全ての絵文字で上記1が可能です。

2についても当然で変換できない文字をユーザが明示的に指定することなく排除
することは避けるべきです。これは、キャリアAの特定の絵文字に対応した絵文
字がキャリアBにない場合のフォールバック機能(例えば代わりに文字列や画像
へのリンクを表示するなど)を実装する際に必要となりますが、これも従来と同
様に例えばmb_substitute_character("entity") などとすることで可能です。
ただし、従来は数値参照で出力されるコードポイントが従来のUnicode PUAから
Unicode 6.0のポイントに変わりますので、フォールバック機能の実装で置換す
る文字列を更新する必要があります。

3は、キャリア間の絵文字変換として一定のニーズがあり、また、PCや
スマートフォンなどでは、OS X LionのApple絵文字に見られるようにUnicode
6.0の絵文字を直接サポートするようになることが予想され、相互運用としての
ニーズがあると思っています。

PUAとのマッピングを自由に設定できるのはある意味理想かもしれませんが、わ
かりやすい実装を作るのは困難ですし、現状でも
mb_encode_numeric_entities()、mb_decode_numeric_entities() 等である程度
は実現できるかもしれません。
手段がないのは困るというのはおっしゃる通りと思います。


(2011年08月25日 12:00), 浅川 倫之 wrote:

> あさかわです。
>
>>
>> 「正しい変換」の解釈が異なるのかもしれませんが、汎用のUTF-8を指定してい
>> る以上、これは仕様でありUnicodeとUTF-8の変換としては正しい動作です。
>
> 略
>
>
> 廣川さんのおっしゃるというか、文字変換のシステムを作成してくれる開発者の思想として正しい動作だと思います。
>
> しかし、絵文字を必要とするニーズとしては。
>
> ドコモの絵文字を格納してドコモで表示
> AUの絵文字を格納してAUで表示
> SBの絵文字を格納してSBで表示
>
> する時に、欠落なく元と同じ文字で表示される事はもちろん。
>
> PC上で、ドコモ,AU,SBの絵文字を表示する時にフォントとして存在しない文字を表示する場合に画像を利用したりしますが。その場合に、対応するコードポイントが保持されていないとそれもできない事になります。
>
> PCではなくても、AUの絵文字の入っているデータを、ドコモで表示する時にも、表示できない文字は画像を利用するなどの対応が必要な時もありますので、表示できない文字を欠落させられるとそれができません。
>
> すると、データとして格納する時は、キャリア別のコードのまま格納して、出力で対応する事になり
> せっかくつくっていただいた、機能を利用できない事になってしまいます。
>
> そういうケースがレアかレアじやないかというのは、その人のおかれる立場で違います。
>
> HTML_Emoji という PHP の絵文字ライブラリを作って公開してくれている村松様のご意見は、
> そのレアじゃない立場を代表してくれています。
>
> じゃそういう人はHTML_Emojiを使えばよいじゃないかと言う意見もあるでしょうが,
> 村松様がご意見を述べられているという事は、自分のライブラリが不要になってでも
> PHPの本体に機能が追加される事を望んでいるのだとおもいます。
>
> そのためには、すくなくとも。HTML_Emoji利用と同等になっていて欲しいと思います。
>
>
> [Unicode 6.0を介した統一された変換をサポートする]
>
> という趣旨で、Unicode 6.0で定義できない文字を,変換側で排除することで、特別な対応なくどのブラウザでも
> 同じ文字が表現できるというメリットがあります。
>
> しかし、Unicode 6.0で定義できない文字を,変換側で排除されてしまうと特別な処理を必要とするシステムでは作成できない事になります。
>
> 現状でも、PHPにかぎらず。ISO-2022では無いということで半角カナを捨てるライブラリがあったりしますが
> そういう場合は、半角仮名を許容したい場合には使えないわけです。
>
> こういう立場もあることをご理解ください。
>
> PUAへのマッピングを、プログラマが再定義できる様になっているとかでも良いと思います。
>
> ワールドワイドな統一思想からは明らかに逸脱した、狭い世界のニーズなので、
> 簡単には使えないのでもかまわないと思います。でもできないのが困ります。
>

--
Rui Hirokawa <[hidden email]> (@rui_hi)
_______________________________________________
PHP-dev mailing list
[hidden email]
http://ml.php.gr.jp/mailman/listinfo/php-dev
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

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

Rui Hirokawa-3
In reply to this post by revulo
廣川です。

>
> ただ、浅川様が述べられている意見の繰り返しのようになってしまいますが、
> 絵文字を 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 <[hidden email]> (@rui_hi)
_______________________________________________
PHP-dev mailing list
[hidden email]
http://ml.php.gr.jp/mailman/listinfo/php-dev
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

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

revulo
村松です。

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

はい、その通りです。


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

はい、Unicode 6.0 に収録されていない絵文字にも対応していただけたので、
確かにこれで用は足りるだろうと思います。

正直なところ、絵文字をこの UTF-8 に変換して保存することにしますと、
結合文字があったり、4バイトの UTF-8 で表される文字があったりして、
普通の PC でも表示できるように <img> タグに変換したりする場合に
扱いづらそうなのですが、何とかなるだろうとは思っています。

現状では UTF-8-Mobile というエンコーディングもあった方が便利ではないか?
という私の考えは変わらないのですが、それについて検討するのは、
他のユーザーの方々が、この絵文字変換の機能を実際に試してみてからでも、
遅くはないのだろうと思いました。

--
Shinya Muramatsu <[hidden email]>
_______________________________________________
PHP-dev mailing list
[hidden email]
http://ml.php.gr.jp/mailman/listinfo/php-dev
Loading...