hack のためのネタ帳, etc,,,

docomo の絵文字を UNICODE に変換

Encoding クラス にて以下のエンコーディングが利用可能
  • SJIS_DOCOMO
  • SJIS_DoCoMo
  • SJIS_KDDI
  • SJIS_SOFTBANK
  • SJIS_SoftBank
  • STATELESS_ISO_2022_JP_KDDI
  • Stateless_ISO_2022_JP_KDDI
  • UTF8_DOCOMO
  • UTF8_DoCoMo
  • UTF8_KDDI
  • UTF8_SOFTBANK
  • UTF8_SoftBank
UNICODE で公式採用されている絵文字なら素の UTF 系のエンコーディングと相互変換出来る模様。
当初の提案には UTF8-Google とかいうのもあったようだが、少なくとも 2.5.0 にはなかった。

ただし docomo の古いフィーチャーフォンで使われている SJIS 絵文字コードの場合、
例えば SJIS_DOCOMO の Present "\xF8\xE6" が UTF8_DOCOMO の "\xEE\x9A\x85" (="\uE685") に変換されてしまうのだが、
これは以下のようにエラーにされてしまう。
irb(main):001:0> "=F8=E6".unpack("M")[0].force_encoding("SJIS-DOCOMO").encode("UTF-8")
Encoding::UndefinedConversionError: "\xEE\x9A\x85" to UTF-8 in conversion from SJIS-DoCoMo to UTF8-DOCOMO to UTF-8
        from (irb):203:in `encode'
        from (irb):203
        from /usr/bin/irb:11:in `<main>'
Emoji Symbols: Background Data L2/09-027R を見ると、U+1f428 が対応してそうなんだけど、Word で 1f428 Alt+x とかすると 🐨 KOALA が出て来て、これは、Unicode6.0の携帯電話の絵文字の一覧 見ると UNICODE 6.0 では確かにコアラのようだ。
これは UNICODE 6.0 だと多分 🎁 (WRAPPED PRESENT: U+1F381) が対応してるんじゃないのかと思うんだけど、この辺りの経緯をまとめた資料がなくて手探りだと良く分からない。

上記、定数の説明で [SEE_ALSO] に挙げられている はリンク切れなので、UNICODE 6.0 よりも前の、既に遠く過去の遺物時代のコードを参照しているのだろうか?

結局、結論として、場当たり的に個別対処するには以下のような感じかなと思う。
irb(main):002:0> "=F8=E6".unpack("M")[0].force_encoding("SJIS-DOCOMO").encode("UTF8-DOCOMO")
=> "\uE685"
irb(main):003:0> "=F8=E6".unpack("M")[0].force_encoding("SJIS-DOCOMO").encode("UTF8-DOCOMO").gsub("\u{E685}".force_encoding("UTF8-DOCOMO"),"\u{1F381}".force_encoding("UTF8-DOCOMO")).encode("UTF-8")
=> "🎁"
irb(main):004:0> "=F8=E6".unpack("M")[0].force_encoding("SJIS-DOCOMO").encode("UTF8-DOCOMO").gsub("\u{E685}".force_encoding("UTF8-DOCOMO"),"\u{1F381}".force_encoding("UTF8-DOCOMO")).encode("UTF-8").encode("UTF8-DOCOMO")
=> "\uE685"

"\u{E685}"→"\u{1F381}"は出来ないけど
"\u{1F381}"→"\u{E685}"は出来るという
極めて謎な状況だが、
一応、変換先は合っていると考えてよさそうだ。

関連

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Wiki内検索

フリーエリア

管理人/副管理人のみ編集できます