Detectar si un carácter unicode es compatible?

Estoy tratando de armar una pequeña aplicación para Android que puede devolver aleatoriamente un emoji al usuario. Mi intención es usar caracteres emoji unicode reales y devolverlos como caracteres de cadena unicode.

He construido una serie completa de cadenas Unicode que podría ser elegido al azar, y muchos se mostrará correctamente. Sin embargo, algunos se muestran como caracteres no admitidos (un rectángulo con una x a través de ella).

Obviamente no todas las plataformas soportarán todos los caracteres unicode emoji, pero si es posible me gustaría una manera de determinar qué es y no es un personaje compatible. Lo ideal sería consultar una lista de caracteres admitidos, pero ser capaz de probar caracteres individuales también haría el trabajo bien.

Por lo tanto, cuando se habla de un carácter que no es "compatible", suena como lo que quieres decir es que la fuente actual no tiene un glifo para el carácter (y la aplicación no tiene lógica de fallback para encontrar una fuente diferente que Hace , o el sistema no tiene ninguna fuente que hace).

En Java regular, esto es bastante fácil: dada una instancia de java.awt.Font , puede ver si tiene un glifo para un carácter Unicode dado usando el método canDisplay .

Las API de Android, por la razón que sea, no parecen exponer una forma de averiguar qué tipo de letra está trabajando. ( android.graphics.Typeface mantiene esa información privada: consulte "Comprobar la familia de un objeto Typeface en Android" .) Sin embargo, al menos puede probar algo como new java.awt.Font("SansSerif", java.awt.Font.PLAIN, 12) para obtener una fuente básica de 12 puntos sans-serif. Usted querrá probar, por supuesto, para ver si eso da una aproximación útil para el emoji que la fuente real será capaz de mostrar.

Puede utilizar Character.isDefined para comprobar si un carácter está definido en la versión de Unicode en el dispositivo.

También revisa Canvas.hasGlyph(String) , que se agregó en el nivel 23. Puede usar esto para probar si un personaje como un emoji tiene un glifo disponible.

Esto es lo que dice la documentación :

boolean hasGlyph (String string)

Determine si el tipo de letra establecido en la pintura tiene un glifo que admite la cadena. El caso más simple es cuando la cadena contiene un solo carácter, en el que este método determina si la fuente tiene el carácter. En el caso de varios caracteres, el método devuelve true si hay un solo glifo que representa la ligadura. Por ejemplo, si la entrada es un par de símbolos indicadores regionales, determine si hay un indicador emoji para el par.

Por último, si la cadena contiene un selector de variación, el método sólo devuelve true si las fuentes contienen un glifo específico para esa variación.

La comprobación se realiza en toda la cadena de fallback, no sólo en la fuente inmediata a la que se hace referencia.

Ver también

  • Cómo detectar compatibilidad de emoji en Android por código
  • No se reciben los caracteres unicode GCM de Android
  • Unicode y Android NDK
  • ¿Por qué 'ARABIC LETTER PEH' no se muestra correctamente en Android 3.x?
  • Enviar un mensaje SMS (UTF-16) con un carácter desconocido reemplazado por un "carácter de reemplazo" en Android
  • Android: ¿Cómo usar los glifos japoneses de Unihan?
  • Letras cirílicas que no se muestran en PDF generadas con iText en Android
  • Creación de softkey con emoji personalizado
  • ¿Hay algún carácter unicode que tiene el glifo que falta en todas las fuentes?
  • Cómo puedo convertir unicode cadena a ASCII en java
  • Insertar símbolos unicode en edittext
  • Cómo enviar caracteres unicode en un HttpPost en Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.