Encoding クラス にて以下のエンコーディングが利用可能
当初の提案には UTF8-Google とかいうのもあったようだが、少なくとも 2.5.0 にはなかった。
ただし docomo の古いフィーチャーフォンで使われている SJIS 絵文字コードの場合、
例えば SJIS_DOCOMO の "\xF8\xE6" が UTF8_DOCOMO の "\xEE\x9A\x85" (="\uE685") に変換されてしまうのだが、
これは以下のようにエラーにされてしまう。
これは UNICODE 6.0 だと多分 🎁 (WRAPPED PRESENT: U+1F381) が対応してるんじゃないのかと思うんだけど、この辺りの経緯をまとめた資料がなくて手探りだと良く分からない。
上記、定数の説明で [SEE_ALSO] に挙げられている はリンク切れなので、UNICODE 6.0 よりも前の、既に遠く過去の遺物時代のコードを参照しているのだろうか?
結局、結論として、場当たり的に個別対処するには以下のような感じかなと思う。
"\u{E685}"→"\u{1F381}"は出来ないけど
"\u{1F381}"→"\u{E685}"は出来るという
極めて謎な状況だが、
一応、変換先は合っていると考えてよさそうだ。
- 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
当初の提案には UTF8-Google とかいうのもあったようだが、少なくとも 2.5.0 にはなかった。
ただし docomo の古いフィーチャーフォンで使われている SJIS 絵文字コードの場合、
例えば SJIS_DOCOMO の "\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}"は出来るという
極めて謎な状況だが、
一応、変換先は合っていると考えてよさそうだ。
- rubyでunicode, UTF8を扱うためのTips
- Ruby Issue Tracking System / Ruby trunk / Feature #2833: 絵文字エンコーディングの提案
- docomo / Basic Pictograms [Take me back...]
- Emoji Symbols: Background Data L2/09-027R
- Wikipedia / Unicode6.0の携帯電話の絵文字の一覧
- CNET Japan / 特集 : 絵文字が開いてしまった「パンドラの箱」
タグ
コメントをかく