¿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):
- Cómo almacenar y mostrar caracteres ISO-8859-1 y UTF8 utilizando perl
- Cadena de byte con UTF-8 da diferentes resultados en Android que en Windows JVM
- Android XmlPullParser UTF-8 problema
- Enviar cadenas codificadas utf-8 en la solicitud HTTP de Android
- Java - Convertir cadena a objeto URI válido
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";
- Detectar subrogados altos en una cadena utilizando expresiones regulares
- Android muestra texto en una codificación incorrecta después de la actualización a Java 8
- Codificación UTF-8 en WebView e ICS
- Cómo convertir una cadena UTF a ANSI y crear un archivo de texto ANSI en SSD con JAVA-ANDROID
- UTF-8 de codificación en Volley Requests
- Codificación Utf-8 para Android
- Extraño problema de codificación JSON en Android 4.1.2
- Android Studio: unmappable character para codificar UTF-8
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.
- Cómo resaltar el elemento seleccionado de Recycler View?
- Android L efecto de tacto de la ondulación en la forma?