java - studio - fuentes android ttf
La fuente personalizada proporciona un glifo incorrecto para ciertas combinaciones de letras en Android (3)
No estoy seguro acerca 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 espaciado de letras minúsculo, que mostrará las letras como se esperaba.
textView1.setText("IJ");
textView2.setLetterSpacing(0.04f);
textView2.setText("IJ");
Resultado:
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 I
y J
individuales existen en la fuente y puedo hacer que aparezcan si configuro el texto en IJ
.
No es una fuente OpenType (no creo que Android siquiera sea compatible con la representación OpenType en fuentes personalizadas), por lo que no debería haber algo 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í . Ponlo 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 .
El holandés ij, sin embargo, es algo más ambiguo. Dependiendo del 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 San sin mayúscula Sans serif, populares en los Países Bajos, normalmente usan una ligadura que se asemeja a una U con un trazo roto hacia la izquierda.
También de Wikipedia :
Sustitución de glifos y composición
Algunos caracteres de compatibilidad son completamente prescindibles para el procesamiento de texto y el software de visualización que cumple con el estándar Unicode. Éstas incluyen:
Ligaduras 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 ligaduras es tratarlas como texto enriquecido y, si se activan, se manejan mediante la sustitución de glifos.
Teniendo esto en cuenta, creo que la fuente que está utilizando se ha aprovechado de este tipo de uso para hacer sus cosas.
Actualización Usando setFontFeatureSettings()
funciona para desactivar 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 pueda estar consciente.
Para las API inferiores a 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 piense 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");
}
}
Parece haber tres soluciones a este problema:
1. Desactivar programáticamente las ligaduras
Puede desactivar las ligaduras programáticamente 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 en API 21.
2. Edite las ligaduras de la fuente
Puede utilizar el software de edición de fuentes para corregir o eliminar los errores de ligadura en la fuente. Vea este Q & A de cómo hacerlo en FontForge. Un posible problema aquí es que los propietarios de derechos de autor de fuentes no pueden permitir que terceros editen sus fuentes.
3. Usa una fuente diferente
Diferentes tipos de letra a menudo están disponibles y eso es cierto en este caso. La misma compañía que tenía la fuente problemática TrueType en la pregunta también tiene una versión OpenType de esa fuente. La versión OpenType no parece tener los errores de ligadura. Una desventaja, sin embargo, es que es significativamente más grande en tamaño, lo que hará que el tamaño de descarga de la aplicación sea más grande.
Notas
- Anteriormente había pensado que no había ninguna representación de ligadura antes de Android 6.0. Sin embargo, las fuentes TrueType aparentemente admiten algunas ligaduras básicas y aquellas se representan en versiones de Android anteriores a la 6.0.
- La siguiente imagen de FontForge muestra todas las ligaduras definidas en la fuente problemática a la que se hace referencia en la pregunta.