Как использовать 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 и более поздних версий.

Intereting Posts
Как очистить (пустой / без значений) прядильщик на кнопке Как активировать продукт в приложении в консоли разработчика Google Play, пока приложение находится в черновике? RecyclerView не отменяет регистрацию от адаптера при изменении ориентации Вызов приложения MediaRecorder в AndroidStudio Исключение libGDX в потоке «Приложение LWJGL» Расширяемое представление списка с расположением таблицы в android Тестирование ViewPager с эспрессо. Как перфорировать действие кнопки? Как отключить прокрутку в DrawerLayout в Android? Как установить ресурс Image в ImageView с помощью DataBinding Выйти из приложения Phonegap-Android Test на кнопке выхода? Android RecyclerView + CursorLoader + ContentProvider + «Загрузить больше» Android-камера Api 2 Ручная фокусировка с сенсорным управлением Android – внедрение startForeground для службы? Удалить маркер из GoogleMap Android – edittext – не отображаются текстовые дескрипторы и нет опции совместного доступа