メモ:Androidの文字列で絵文字を使う

Androidでも、Android 5.0 (Lollipop) からはかなり絵文字が充実しました。

実際には、Android 4.1 (Jelly Bean) から、Unicode 6.0.0で追加された絵文字に対応しており、Android 4.4 (KitKat) からは色付きの絵文字に対応しました。

ではということで、この絵文字を文字列として扱おうと思うわけですが、これはそう簡単にはいきません。
次のようなエラーが出てしまいます。

art/runtime/check_jni.cc:65] JNI DETECTED ERROR IN APPLICATION: input is not valid Modified UTF-8: illegal start byte 0xf0

UTF-8ではダメかと思い、UTF-16にしてみても変わりません。
どうやら、Androidの文字列処理は、UTF-8として3バイトまでのシーケンスにしか対応しておらず、4バイトになるシーケンス、つまりUTF-16でいうところのサロゲートペアになるシーケンスには未対応のようです。

すなわち、補助多言語面(U+1xxxx)にある絵文字は、即値で記載できないということになります。
より正確には、U+FFFF を超える全ての文字は記載できないということになります。

このような絵文字を扱う場合、最も簡単なのは、文字コードで書くのが最も無難という結論でした。
ただし、例えば電車の絵文字「🚃」 U+1F683 を、

String train = "\u1F683";

と書いても期待通りにはなりません。

Javaの文字列の扱い方を思い出すとすぐ分かりますが、JavaはUTF-16で文字列を扱っています。
ですから、電車であれば

String train = "\uD83D\uDE83";

のように書く必要があります。
あまりにも分かりにくいので、ソース中に書く場合は、コメントを付けておいた方がよいでしょう。

追記:
strings.xml などXMLでリソースとして保存する場合、残念ながらこの方法でもエラーとなってしまいます。
リソースとしては、U+FFFF を超える文字を簡単に扱うことはできないようです。

2015/02/07(土)22:11 |Comments(0) |Trackback(0)

文字 | ソフトウェア開発 | コンピュータ | [編集]

▲ページトップ

コメント

コメントの投稿

全国の ICカード これひとつ ホーム ecomyca(えこまいか)の技術情報
トラックバック

この記事にトラックバックする(FC2ブログユーザー)
▲ページトップ

カレンダー

07 | 2017/08 | 09
- - 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 - -

プロフィール

miraicorp

Author:miraicorp
未来情報産業(株) 社長

主として「ICカードこれひとつ」や「文字、文字コード」処理、時々C++などについて記述しています。

twitterツイッター

管理用

検索フォーム

お知らせ

コメント等お気軽にどうぞ。

気に入ったら拍手して頂けると、今後の記事を書く際の参考や励みになります。

■お仕事を募集しております
ソフトウェア製造の仕事や、原稿執筆の仕事などを随時受け付けております。
お気軽にご相談下さい

■初めての方へ
こまごまと更新しているため、他にも関連する記事があるかもしれません。
「月別アーカイブ」「検索フォーム」「カテゴリ」などをお試し下さい。
トップページはこちら

最新記事

最新コメント

最新トラックバック

月別アーカイブ

カテゴリ

広告枠

メール

メールはこちら

リンク

このブログをリンクに追加する

RSSリンクの表示

QRコード

QR