Intereting Posts
Запуск тестов автоматизации пользовательского интерфейса с помощью градиента без удаления Как сохранить настройки языка приложения после перезагрузки устройства? Скопировать каталог из Активы в локальный каталог «BadParcelableException: ClassNotFoundException при unmarshalling <myclass>» при использовании метода Parcel.read, который имеет ClassLoader в качестве аргумента Android: рисовать дугу с цветом заливки градиента Магия за файлом R.java Android Studio не работает нормально с gradle 2.10 и плагин gradle 2.0.0-alpha5 Как привести индикатор страницы круга на передний план в Android Почему мой FFT дает отличный результат визуализации, чем Windows Media Player? Получение ОДИНОЧНОГО курсора с полными именами и номерами телефонов Метод setDefaultPushCallback из типа PushService устарел с помощью android Не удалось создать контекст 0x3005 Android Как получить значение динамически добавленного Spinner Android ProgressDialog с проблемой потоковой передачи Как создать границу речевого пузыря для пользовательского значка Google Marker с помощью Picasso?

Как использовать unicode в ресурсе Android?

Я хочу использовать этот символ Юникода в файле ресурсов.

Но что бы я ни делал, я заканчиваю крах dalvikvm (тестировался с Android 2.3 и 4.2.2):

W/dalvikvm( 8797): JNI WARNING: input is not valid Modified UTF-8: illegal start byte 0xf0 W/dalvikvm( 8797): string: '📡' W/dalvikvm( 8797): in Landroid/content/res/StringBlock;.nativeGetString:(II)Ljava/lang/String; (NewStringUTF) E/dalvikvm( 8797): VM aborting F/libc ( 8797): Fatal signal 11 (SIGSEGV) at 0xdeadd00d (code=1), thread 8797 (cz.ipex...) 

Я пробовал эту версию в файле ресурсов:

 <string name="geolocation_icon" translatable="false">📡</string> <!-- HTML --> <string name="geolocation_icon" translatable="false">\uD83D\uDCE1</string> <!-- escaped unicode --> <string name="geolocation_icon" translatable="false">📡</string> <!-- unicode character --> 

Обратите внимание, что использование его в Java String в коде работает нормально:

 final String geolocation_icon = "\uD83D\uDCE1"; 

Ваш символ ( U+1F4E1 ) находится за пределами Unicode BMP (Basic Multilingual Plane – диапазон от U+0000 до U+FFFF ).

К сожалению, Android имеет очень слабую (если есть) поддержку для символов, отличных от BMP. Представление UTF-8 для символов, отличных от BMP, требует 4 байта ( 0xF0 0x9F 0x93 0xA1 ). Но парсер Android UTF-8 понимает только 3 байта (см. Здесь и здесь ).

Он работает для вас, когда вы используете представление суррогатной формы UTF-16 этого символа: "\uD83D\uDCE1" . Если бы вы могли кодировать каждый суррогатный символ UTF-16 в модифицированном UTF-8 (aka CESU-8 ) – он бы взял 6 байтов всего (3 байта в UTF-8 для каждого члена суррогатной пары), тогда это было бы возможно , Но Android также не поддерживает CESU-8 .

Итак, ваше текущее решение – жесткое кодирование этого символа в исходном коде как суррогатная пара UTF-16 кажется самым легким, по крайней мере до тех пор, пока Android не начнет полностью поддерживать не BMP UTF-8 .

ОБНОВЛЕНИЕ : это, по-видимому, частично исправлено в Android 6.0. Эта фиксация была объединена с Android 6 и разрешает присутствие 4-байтных символов UTF-8 в XML-ресурсах. Это не идеальное решение – оно просто автоматически преобразует 4-байтовый UTF-8 в подходящую суррогатную пару. Однако он позволяет переместить их из исходного кода в XML-ресурсы. К сожалению, вы не можете использовать это решение, пока ваше приложение не сможет остановить любую версию Android, кроме 6.0 и более поздних версий.