Cómo usar unicode en Android recursos?

Quiero usar este de caracteres unicode en mi archivo de recursos.

Pero todo lo que hago, termino con dalvikvm accidente (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...)

Traté de estas versión en mi archivo de recursos:

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

Nota de que el uso en Java Cadena en el código funciona bien:

final String geolocation_icon = "\uD83D\uDCE1";
  • Intenta usar UTF-8 en el archivo XML? El uso de hexdump, se puede confirmar que está codificada como 0xF0 0x9F 0x93 0xA1 secuencia?
  • Sí, lo es, y si nos fijamos en la salida de error de arriba, verás que es quejarse acerca de él: input is not valid Modified UTF-8: illegal start byte 0xf0
InformationsquelleAutor Pitel | 2013-05-28

2 Kommentare

  1. 52

    Tu personaje (U+1F4E1) está fuera de Unicode BMP (Plano Multilingüe Básico rango de U+0000 a U+FFFF).

    Por desgracia, Android tiene muy débil (si cualquier) apoyo a la no-BMP caracteres. UTF-8 representación para los no-BMP caracteres requiere 4 bytes (0xF0 0x9F 0x93 0xA1). Pero, Android UTF-8 analizador sólo entiende de 3 bytes máximo (ver aquí y aquí).

    Funciona para usted cuando usted utiliza UTF-16 sustituto forma de representación de este personaje: "\uD83D\uDCE1". Si fueron capaces de codificar cada suplente UTF-16 carácter de la modificación UTF-8 (aka CESU-8) – tomaría 6 bytes total (3 bytes en UTF-8 para cada uno de los miembros de par suplente), entonces sería posible. Pero, Android no admite CESU-8 ya sea de forma explícita.

    Así, la solución actual – duro-codificación de este símbolo en el código fuente como sustituto UTF-16 par parece más fácil, al menos hasta que Android se inicia apoyar completamente no-BMP UTF-8.

    ACTUALIZACIÓN: esto parece ser parcialmente solucionado en Android 6.0. Este commit se ha fusionado en Android 6, y permite la presencia de 4-bytes de caracteres UTF-8 en los recursos XML. Su no solución perfecta – es simplemente convertir de forma automática de 4 bytes UTF-8 en el correspondiente par suplente. Sin embargo, permite a los mueva de su código fuente en XML de los recursos. Desafortunadamente, usted no puede utilizar esta solución hasta su aplicación puede dejar de apoyar a cualquier versión de Android, excepto para la 6.0 y versiones posteriores.

    • Esto es muy frustrante ya que hace que el archivo de Clase mucho más grande de lo que necesita ser. Lo ideal sería separar estas cadenas unicode en un arrays.xml o strings.xml archivo.
    • usted podría querer archivo de un error en Android base de datos de errores.
    • hola, tengo un archivo xml con los pares suplentes como «\uD83D\uDCE1» pero me estoy poniendo errores al tratar de analizar el archivo, me podrían ayudar ?
    • puede utilizar los pares suplentes en el código fuente de Java, pero no en recursos XML.
    • Este web le permite calcular los pares suplentes.
  2. 0

    Hacerlo de esta manera

    No mantener problemática emoji en el strings.xml

    agregar mediante programación

    <string name="hi_welcome_msg">Hi %1$s</string>
    
    getString(R.string.hi_welcome_msg, user.getFullName() + " \uD83D\uDC4B" );

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea