2009年4月11日土曜日

[Softbank] [Web] Softbank絵文字仕様 SJIS/Unicode編

ソフトバンクの絵文字はISO-2022に基づくエスケープシーケンスESC $[GEFOPQ]0x21~7Eがn回出現し0xf0となるISOコード, シフトSJISコードおよびUnicodeとなる。具体的に見てみる。

//絵文字1(基本)
((c1 == 0xF9 && ((c2 >= 0x41 && c2 <= 0x7E) (c2 >= 0x80 && c2 <= 0x9B)))
//絵文字2(基本) (c1 == 0xF7 && ((c2 >= 0x41 && c2 <= 0x7E) (c2 >= 0x80 && c2 <= 0x9B)))
//絵文字3(基本) (c1 == 0xF7 && (c2 >= 0xA1 && c2 <= 0xF3))
//絵文字4(拡張) (c1 == 0xF9 && (c2 >= 0xA1 && c2 <= 0xED))
//絵文字5(拡張) (c1 == 0xFB && ((c2 >= 0x41 && c2 <= 0x7E) (c2 >= 0x80 && c2 <= 0x8D)))
//絵文字6(拡張) (c1 == 0xFB && (c2 >= 0xA1 && c2 <= 0xD7)));

シフトSJIS体系ではF7,F9,FBを先頭バイトに持つ絵文字1~6までのコードに対応する。次にUnicode範囲を見てみる。

(uni >= 0xE001 && uni <= 0xE03F) (uni >= 0xE040 && uni <= 0xE05A) (uni >= 0xE101 && uni <= 0xE13F) (uni >= 0xE140 && uni <= 0xE15A) (uni >= 0xE201 && uni <= 0xE23F) (uni >= 0xE240 && uni <= 0xE253)
(uni >= 0xE301 && uni <= 0xE33F) (uni >= 0xE340 && uni <= 0xE37F) (uni >= 0xE401 && uni <= 0xE43F) (uni >= 0xE440 && uni <= 0xE44C) (uni >= 0xE501 && uni <= 0xE53E)

一般的な絵文字の扱いではこのUnicodeの範囲に+0x1000のオフセットを付けたコードとして扱う。これにより私用領域に全ての絵文字を格納できるようになる。

SBのISO表現からUnicodeへの変換はISO表現の第三バイトの文字を0xF0~0xF5(0xE0~0xE5)にマッピングしたものを第一バイトとしISO表現の第4バイト以降の連続-0x20が第二バイトとなる。

[AU] [Web] AU絵文字仕様 SJIS/Unicode編

次にAU絵文字について。前回の記事と同様にソースとしてMobilePictogramConverterを参照している。EZWebではWebで扱われるコードに癖がある。Webサイトで扱われるコードは以下の通り。絵文字を参照する<img icon="絵文字番号" />, <img localsrc="絵文字番号" />で指定するコンテンツ用コードおよび、数値文字参照によるUnicode表現、utf-8ページから送出される特殊Unicode, シフトJIS表現の絵文字コードとなる。詳しい変換方法も紹介する。

まずAUのUnicodeから見てみる。文字参照が参照するのはコードはUnicodeとなる。よって数値文字参照で指定されるコードの体系となる。範囲は以下の通り。

  • (uni >= 0xE468 && uni <= 0xE5DF) (uni >= 0xEA7F && uni <= 0xEB8E);

次にシフトJIS表現を見てみる

  • ((c1 == 0xF3 c1 == 0xF6 c1 == 0xF7) && ((c2 >= 0x40 && c2 <= 0x7E) (c2 >= 0x80 && c2 <= 0xFC))) (c1 == 0xF4 && ((c2 >= 0x40 && c2 <= 0x7E) (c2 >= 0x80 && c2 <= 0x8D)));

第一バイトが0xF3, 0xF6, 0xF7で第二バイトが0x40, 0x7Eおよび0x80から0xFCの範囲もしくは第一バイトが0xF4で第二バイトが0x40から0x7Eおよび0x80および0x8Dとなる。

シフトJISから派生するUTF-8ページから送出されるUnicodeはシフトSJISをベースとし-0x700の位置となる。この範囲はDocomo, Softbank双方のUnicode表現と重複しない。よってUTF-8ページにおいても入力処理ロジックは一つで対応できるということになる。

次に変換を見てみる。以下はUCS-2からシフトSJISへ変換する場合の対応表となる。境界値は新たに設定してある。シフトSJISからUTF-8変換のソースはMobilePictogramConverter に含まれているのでそちらを参照。

// 0xF340 -> 0xF352 -3443 D73 E5CD E5DF F340 F352
// 0xF353 -> 0xF37E -2259 8D3 EA7F EAAB F352 F37E
// 0xF380 -> 0xF3CE -2260 8D4 EAAC EAFA F380 F3CE
// 0xF3CF -> 0xF3FC -2241 8C1 EB0E EB3B F3CF F3FC
// 0xF440 -> 0xF47E -2308 904 EB3C EB7A F3FD F47E
// 0xF480 -> 0xF493 -2309 905 EB7B EB8E F480 F493
// 0xF640 -> 0xF67E -4568 11D8 E468 E4A6 F640 F67E
// 0xF680 -> 0xF6FC -4569 11D9 E4A7 E523 F680 F6FC
// 0xF740 -> 0xF77E -4636 121C E524 E562 F6FD F77E
// 0xF780 -> 0xF7D1 -4637 121D E563 E5B4 F780 F7D1
// 0xF7D2 -> 0xF7E4 -3287 CD7 EAFB EB0D F7D2 F7E4
// 0xF7E5 -> 0xF7FC -4656 1230 E5B5 E5CC F7E5 F7FC


UTF-16コードで扱える言語では実装が容易となる。

[DOCOMO] [Web] DOCOMO絵文字仕様 SJIS/Unicode編

唐突ながらDOCOMO絵文字仕様について。ソースとしてMobilePictogramConverterを参照している。SJISの第一バイトは0xF8および0xF9, 第二バイト0x40, 0x7Eの範囲, 0x80, 0xFCの範囲となる。UnicodeとSJISの境界を見れば一部飛んでいる部分がある。この部分には隠し絵文字が該当する。
  • (c1 == 0xF8 c1 == 0xF9) &&
  • ((c2 >= 0x40 && c2 <= 0x7E) (c2 >= 0x80 && c2 <= 0xFC));

参照

DOCOMOのUCSからSJISへの変換は以下のルールとなる。


if ( c >= 0xE63E && c <= 0xE757 ) { int code; if ( c <= 0xE69B ) { code = c+0x1261; }else if ( c <= 0xE6DA ) { code = c+0x12A4; }else{ code = c+0x12A5; } return code; }else{ return c; }


実際に境界値を見てみる。0xE63E+0x1261=F89F 0xE69B+0x1261=0xF8FC, 0xE69C+0x12A4=0xF940,0xE6DA+0x12A4=0xF97E,0xE6DB+0x12A5=0xF980,0xE757+0x12A5=F9FC。次にSJISからUTF-16を見てみる。


if ( sjis >= 0xF89F && sjis <= 0xF9FC ) { int code; if ( sjis <= 0xF8FC ) { code = sjis-0x1261; } else if ( sjis <= 0xF97E ) { code = sjis-0x12A4; } else { code = sjis-0x12A5; } return code; }else{ return sjis; }
UCSでのDOCOMO絵文字の範囲は0xE63E,0xE757となる。