¿Cómo usar unicode en los recursos de Android?

Quiero utilizar este carácter unicode en mi archivo de recursos.

Pero lo que hago, termino con crash de dalvikvm (probado con Android 2.3 y 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...) 

He intentado esta versión en mi archivo de recursos:

 <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 --> 

Tenga en cuenta que su uso en Java String en código funciona bien:

 final String geolocation_icon = "\uD83D\uDCE1"; 

Su carácter ( U+1F4E1 ) está fuera de Unicode BMP (Basic Multilingual Plane – rango de U+0000 a U+FFFF ).

Lamentablemente, Android tiene un soporte muy débil (si es que existe alguno) para los personajes que no son BMP. UTF-8 representación UTF-8 para caracteres que no son BMP requiere 4 bytes ( 0xF0 0x9F 0x93 0xA1 ). Sin embargo, el analizador de UTF-8 Android sólo entiende 3 bytes máximo (vea aquí y aquí ).

Funciona para usted cuando utiliza UTF-16 representación de forma sustituta de este carácter: "\uD83D\uDCE1" . Si pudiera codificar cada carácter UTF-16 sustituto en UTF-8 modificado (también conocido como CESU-8 ), se necesitaría 6 bytes totales (3 bytes en UTF-8 para cada miembro del par sustitutorio), entonces sería posible . Pero, Android tampoco soporta CESU-8 explícitamente.

Por lo tanto, su solución actual – codificación dura de este símbolo en el código fuente como sustituto par UTF-16 parece más fácil, al menos hasta que Android comienza a apoyar plenamente no BMP UTF-8 .

ACTUALIZACIÓN : esto parece estar parcialmente corregido en Android 6.0. Este commit se ha combinado en Android 6 y permite la presencia de caracteres UTF-8 de 4 bytes en recursos XML. Su solución no es perfecta – simplemente convertirá automáticamente 4 bytes UTF-8 en el par de sustitución adecuado. Sin embargo, permite moverlos desde su código fuente a recursos XML. Desafortunadamente, no puede utilizar esta solución hasta que su aplicación pueda dejar de soportar cualquier versión de Android excepto para 6.0 y versiones posteriores.

  • EditText devuelve mejorado ISO-8859-1 en lugar de codificación UTF-8 para umlauts alemán?
  • Solicitud de aplicaciones para Android Servicio WCF (SerializationException - utf-8 related)
  • Búsqueda en una base de datos SQLite que contenga datos cítricos
  • Android Talkback no lee caracteres utf-8 en la vista Web usando html
  • Cómo configurar UTF-8 para el archivo xml analizado utilizando SAX Parser en android
  • La codificación de html de Android 4.0 se descompone en la vista web
  • Cualquier forma de hacer que el navegador predeterminado de Android reconozca nombres de archivo no ASCII en las descargas de "Content-Disposition: attachment"?
  • Conversión UTF-8 en Android?
  • Post datos UTF-8 codificados en el servidor pierde ciertos caracteres
  • Android - Cómo convertir la cadena en utf-8 en android
  • Soporte unicode en android ndk
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.