2011-09-21 17 views
24

PREÁMBULO: desde API 17 (Android 4.2), existe un método TextView.setTextLocale() que resuelve explícitamente este problema para TextViews y clases derivadas. Asigne una configuración regional japonesa (Locale.JAPAN) y los caracteres Unihan se verán en japonés.Caracteres japoneses que parecen chinos en Android


Tengo una aplicación en Android que muestra texto en japonés en WebViews y TextViews. Hay algunos caracteres chinos (kanji) que se ven, por convención, de manera diferente en China y en Japón, pero comparten el mismo punto de código Unicode. Normalmente, el navegador se basaría en la etiqueta lang para elegir el glifo correcto. En Android, todos adoptan de forma predeterminada sus formas chinas, y quiero formas japonesas.

El problema está bien explicado en this article. Este artículo también sirve como una ilustración perfecta del problema: cuando se mira en Android (hasta 2.2), los caracteres en los "Ejemplos de caracteres dependientes del idioma" tienen el mismo aspecto y el chino.

El uso del atributo lang="ja" no ayuda. Cambiar la configuración regional del sistema completo a japonés tampoco ayuda.

Me pregunto acerca de los teléfonos Android que se venden en Japón. ¿Los caracteres como 直, 今, 化 también parecen de estilo chino? Estoy asumiendo que no.

Así que las preguntas son: ¿hay imágenes oficiales de Android por ahí? ¿Puedo obtener uno para ejecutar en el emulador? ¿Sigue siendo la fuente DroidSansFallback la única fuente compatible con CJK en esos? Y si lo es, ¿es lo mismo que en el vanilla USA USA?

Espero que los glifos japoneses estén ocultos en algún lugar profundo de la fuente (área privada Unicode o algo así). Si es así, podría aprovecharlos ...

EDITAR: localizó DroidSansJapanese.ttf, lo instaló en el emulador copiando en/system/fonts, reinició. No hizo ninguna diferencia en el aspecto del artículo de Unihan. Incluso el área de sugerencia de la entrada de texto en japonés (que debería saberse mejor) se muestra como en chino.

¿Cómo sé el tipo de letra del DroidSansJapanese.ttf? Tengo la sensación de que todavía es Droid Sans, lo mismo que en la fuente incorporada DroidSansFallback. Pero si contienen el mismo tipo de letra, ¿qué gobierna cuál debería tener prioridad? Uno pensaría: sistema local, pero aparentemente no. Las fuentes en Android se instalan solo copiando, ¿verdad?

+1

FYI esos personajes se ven de estilo chino en su publicación. :) –

+0

Esos personajes que publicaste son palabras en chino ... parte de la palabra japonesa también tendrá alguna palabra en chino – xDragonZ

+0

Estoy en Japón y no tengo ningún problema con eso. Nosotros (compañía) tenemos una versión americana (?) De la galaxia y no hay problema con mostrar caracteres japoneses. Una cosa que me traería problemas en webviews no está fijando la etiqueta META UTF-8: ¿Puedes publicar un enlace o una muestra de la página con la que estás teniendo problemas? ¿Con qué dispositivo estás teniendo problemas? Puedo intentar responder si me das información más detallada. Aquí solo dices que Android no puede mostrar japonés, lo cual no creo que sea cierto. – DallaRosa

Respuesta

4

Hay fuentes con soporte japonés completo. Escuché a algunas personas hablar sobre DroidSansJapanese.tff y TakaoPGothic.

4

Encontrado una solución un tanto díficil.

La fuente DroidSansJapanese.ttf existe y puede descargarse, por ejemplo, here. Lo descargué, lo renombré a DroidSansJapanese.mp3 para evitar el límite de 1MB de activos comprimidos y lo coloqué debajo de assets/web. entonces me presenté la siguiente declaración CSS:

@font-face 
{ 
font-family: "DroidJP"; 
src:url('DroidSansJapanese.mp3') 
} 

Luego añade 'DroidJP' a la font-family de todos los estilos CSS relevante. La forma en que cargo mi HTML, la carpeta assets/web ya está designada como la base para cargar contenido vinculado.

Tras un examen cuidadoso, encontré varios lugares en la aplicación donde el japonés estaba en TextView s.Para aquellos, He cargado el tipo de letra así:

Typeface s_JFont = 
    Typeface.createFromAsset(Ctxt.getAssets(), "web/DroidSansJapanese.mp3"); 

y llamé setTypeface() en cada Vista de Texto pertinente. ¡Ahora para PROFIT!

Esto expandió mi APK por aproximadamente 1 MB. Había una manera alternativa, donde almacenaba la fuente en los activos en forma comprimida, eso me ahorraría unos 500 KB de tamaño APK, pero luego tendría que expandirlo a la memoria del teléfono en la primera ejecución, preocupación acerca de la ruta de la carpeta de datos y pierde compatibilidad con Android 1.5.

Se debe un poco de crédito: here y here. No funciona en Android 2.1 (WebViews, no en TextViews): es known bug.

Ahora, la pregunta sigue siendo: ¿cómo identifico los dispositivos donde la fuente predeterminada ya contiene las formas japonesas?

EDITAR re: el hack mp3. Implementé la solución fragmentada al principio, pero luego decidí ir con la fuente en los activos. El enfoque fragmentada tiene una boca - un tamaño más pequeño APK - y las siguientes desventajas:

  • consume más memoria del teléfono - se termina el almacenamiento tanto de fuente comprimida en activos y no comprimido en el directorio de datos
  • es incompatible con Android 1.5 en el lado de Vista de Texto - el método Typeface.createFromFile() se introdujo en el nivel API 4
  • generación dificulta el HTML - CSS con la declaración @ font-face necesita ser parametrizado, ya que la ruta de datos es una variable
  • ralentiza la primera aplicación inicio: gasta tiempo combinando los fragmentos

Tampoco es una opción almacenar la fuente como un elemento comprimido: la fuente no aparece en WebView y se puede ver claramente en LogCat el mensaje "Los datos exceden UNCOMPRESS_DATA_MAX".

+0

No entiendo el truco .mp3. Teóricamente, Android Asset Packaging Tool no comprime (o no hace muy bien) los archivos mp3. Si abre el archivo fuente 'Package.cpp' de Android, que se encuentra en el paquete' \ tools \ aapt' del kernel, justo en la parte superior del archivo puede encontrar una matriz char llamada 'kNoCompressExt []' donde aparece el mp3. –

+0

Si almacena un activo comprimido de más de 1 MB, intentar abrirlo a través de AssetManager.open() generará un error. Soluciones alternativas enumeradas [aquí] (http://stackoverflow.com/questions/2860157/load-files-bigger-than-1m-from-assets-folder/3093966). –

+0

Exactamente, lea la respuesta n. ° 2 en esa publicación. Si cambia el nombre a mp3, le está diciendo al AAPT que no lo comprima, ya que ya está comprimido. –

Cuestiones relacionadas