Estoy usando una fuente personalizada en mi proyecto de Android. Por alguna razón cuando el texto incluye las letras IJ juntas, me da el siguiente glifo:
Este parece ser el glifo ubicado en \uE2C5 de la región PUA de la fuente.
Los glifos individuales I y J existen en la fuente y puedo hacer que aparezcan si configuro el texto en IJ .
No es una fuente OpenType (no creo que Android sea compatible con la representación OpenType en fuentes personalizadas), por lo que no debería suceder nada como esto. ¿Que esta pasando aqui?
El problema es reproducible con el siguiente proyecto simple:
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView textView = (TextView) findViewById(R.id.textview); Typeface tf = Typeface.createFromAsset(this.getAssets(), "MenksoftHawang.ttf"); textView.setTypeface(tf); textView.setText("IJ"); } }La fuente se puede descargar desde aquí . Póngalo en la carpeta de activos en el proyecto.
Realmente no puedo hablar de la razón por la que está viendo lo que está viendo, pero la combinación de letras de "IJ" parece tener un historial de tratamiento especial. De la página de Wikipedia sobre ligadura tipográfica .
La ij holandesa, sin embargo, es algo más ambigua. Según el estándar utilizado, se puede considerar un dígrafo, una ligadura o una letra en sí misma, y sus formas en mayúsculas y minúsculas a menudo están disponibles como un solo glifo con una ligadura distintiva en varias fuentes profesionales (por ejemplo, Zapfino). Los glifos IJ en mayúscula sans serif, populares en los Países Bajos, suelen utilizar una ligadura que se asemeja a una U con un trazo roto a la izquierda.
También de Wikipedia :
Sustitución y composición de glifos
Algunos caracteres de compatibilidad son completamente prescindibles para el procesamiento de texto y el software de visualización que se ajusta al estándar Unicode. Éstos incluyen:
Ligaduras Las ligaduras como 'ffi' en la escritura latina a menudo se codificaban como un carácter separado en conjuntos de caracteres heredados. El enfoque de Unicode para las ligaduras es tratarlas como texto enriquecido y, si está activado, manejarlas a través de la sustitución de glifos.
Dado esto, supongo que la fuente que está utilizando se ha aprovechado de este tipo de uso para hacer lo suyo.
Actualizar usando setFontFeatureSettings() funciona para deshabilitar la visualización del glifo como se muestra en el siguiente código. Desafortunadamente, esto solo está disponible en API 21+. Hay una advertencia de que puede haber otros efectos secundarios de los que puede ser consciente.
Para las API por debajo de 21, puede usar un programa de edición de fuentes como FontForge y eliminar el glifo en U+E2C5. He hecho esto y elimina el glifo. Esta puede ser la mejor manera de hacerlo, siempre y cuando crea que puede identificar todas las combinaciones de letras que pueden dar como resultado un glifo.
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); String features = "\"liga\"=0"; TextView textView = (TextView) findViewById(R.id.textview); Typeface tf = Typeface.createFromAsset(this.getAssets(), "MenksoftHawang" + ".ttf"); textView.setTypeface(tf); textView.setFontFeatureSettings(features); textView.setText("IJ ij"); } }No estoy seguro de la causa exacta del problema, supongo que también podría ser un problema de fuente.
Pero como solución alternativa, puede aplicar un espacio entre letras pequeño, que mostrará las letras como se esperaba.
textView1.setText("IJ"); textView2.setLetterSpacing(0.04f); textView2.setText("IJ");Resultado:
Parece que hay tres soluciones a este problema:
Puede deshabilitar las ligaduras mediante programación con setFontFeatureSettings (como se sugiere aquí ) o setLetterSpacing (como se sugiere aquí ). Una desventaja de estos dos métodos es que solo están disponibles desde API 21.
Puede usar el software de edición de fuentes para corregir o eliminar los errores de ligadura en la fuente. Consulte estas preguntas y respuestas para saber cómo hacerlo en FontForge. Un problema potencial aquí es que los propietarios de los derechos de autor de las fuentes pueden no permitir que terceros editen sus fuentes.
A menudo hay diferentes fuentes disponibles y eso es cierto en este caso. La misma empresa que tenía la fuente TrueType problemática en la pregunta también tiene una versión OpenType de esa fuente. La versión OpenType no parece tener los errores de ligadura. Sin embargo, una desventaja es que es significativamente más grande en tamaño, lo que hará que el tamaño de descarga de la aplicación sea mayor.
