Cómo el renderizado de fuentes CJK revela tu sistema real en la huella
Las familias de fuentes chinas, japonesas y coreanas, sus cadenas de sustitución y sus métricas pueden revelar el sistema host. Qué cambia y qué exige un resultado coherente.
BotBrowser Team
Prefieres la documentación del producto mantenida?
Este artículo tiene una página equivalente en el centro de documentación. Usa los docs para el flujo canónico, las flags actuales y la referencia duradera.
BotBrowser puede alinear el paquete y la enumeración de fuentes de un perfil autorizado para pruebas CJK, pero no garantiza la aceptación del sitio ni controla su CSS, la carga de fuentes o el servidor.
TL;DR
TL;DR: La disponibilidad, sustitución y métrica de las fuentes CJK pueden revelar el sistema host. BotBrowser puede mantener alineados el paquete de fuentes y la enumeración del perfil para pruebas autorizadas, pero no garantiza que un sitio acepte esa identidad ni controla el CSS de la página o su servidor.
Las comparaciones del renderizado CJK entre hosts revelan los límites que quedan fuera del control de BotBrowser.
Contenido
- Por qué el texto CJK revela la plataforma host
- Familias de fuentes CJK por plataforma
- Cadenas de sustitución y métricas de texto
- Por qué las correcciones en el host dejan una brecha medible
- Elegir un modo de fuentes para trabajo con CJK
- Comprobar el resultado y conocer los límites
- Conclusión práctica
Por qué el texto CJK revela la plataforma host
El texto chino, japonés y coreano es una de las formas más rápidas que tiene una página de saber en qué sistema operativo se ejecuta realmente un navegador. Cada plataforma incluye sus propias familias de fuentes CJK, resuelve las fuentes ausentes con su propia cadena de sustitución y dibuja los glifos con su propia pila de renderizado de texto. Un perfil que parece coherente con texto latino puede seguir mostrando la plataforma host en cuanto una página mide o dibuja caracteres de Asia oriental.
El motivo es sencillo. Fuentes latinas como Arial o Helvetica existen en varios sistemas, así que una lista que las contiene dice poco. Las fuentes CJK son grandes, dependen de un fabricante y se instalan según los paquetes de idioma del sistema. Una lista que contiene Microsoft YaHei apunta a Windows. Una lista que contiene PingFang SC apunta a macOS. Una lista que contiene Noto Sans CJK y WenQuanYi apunta a un escritorio o servidor Linux típico.
Las secciones siguientes examinan qué expone el renderizado CJK, por qué las correcciones habituales en el host dejan una brecha medible y qué exige un resultado coherente entre plataformas. También muestran cómo elegir un modo de --bot-fonts para un flujo de trabajo CJK y cómo comprobar el resultado con una breve comparación de anchos en Canvas. Para una visión más amplia de las señales de fuentes, consulta las huellas de fuentes y la coherencia del texto entre plataformas.
Familias de fuentes CJK por plataforma
Las listas siguientes son ejemplos representativos, no inventarios completos. Las instalaciones reales varían según la versión del sistema operativo, los paquetes de idioma instalados y las fuentes que haya añadido el usuario o un administrador. Úsalas para entender qué familias suelen pertenecer a cada plataforma, no como una lista de comprobación que toda máquina deba cumplir.
Windows suele incluir estas familias CJK.
- Chino simplificado: Microsoft YaHei, SimSun, SimHei, FangSong, KaiTi, NSimSun
- Chino tradicional: Microsoft JhengHei, MingLiU, PMingLiU
- Japonés: Yu Gothic, Meiryo, MS Gothic, MS Mincho, MS PGothic
- Coreano: Malgun Gothic, Batang, Dotum, Gulim, Gungsuh
macOS suele incluir estas familias CJK.
- Chino simplificado: PingFang SC, STHeiti, STSong, STKaiti, STFangsong
- Chino tradicional: PingFang TC, PingFang HK, LiSong Pro
- Japonés: Hiragino Sans, Hiragino Kaku Gothic, Hiragino Mincho
- Coreano: Apple SD Gothic Neo, AppleMyungjo, Nanum Gothic
Las distribuciones de Linux suelen incluir estas familias CJK, según los paquetes que se hayan instalado.
- Los tres idiomas: Noto Sans CJK (variantes SC, TC, JP y KR) y Noto Serif CJK
- Chino: WenQuanYi Micro Hei, WenQuanYi Zen Hei
- Japonés: IPAGothic, IPAMincho, Takao Gothic
- Coreano: UnBatang, UnDotum
La consecuencia práctica es un conjunto de incoherencias que se reconocen a simple vista. Un perfil que declara Windows con configuración regional china pero no informa de Microsoft YaHei ni de SimSun es incoherente, porque una instalación china de Windows las incluye de serie. Un perfil de macOS pensado para Japón que carece de Hiragino Sans es incoherente de la misma manera. Una máquina Linux que informa de fuentes de Windows junto a fuentes de Apple no coincide con ninguna instalación real, ya que esas familias nunca provienen de un mismo fabricante. Para la carga de fuentes web y la estabilidad del diseño, consulta Carga de fuentes web y estabilidad del diseño.
La región también importa dentro del chino. El chino simplificado es la norma en China continental, mientras que el chino tradicional se usa en Taiwán y Hong Kong, y cada plataforma tiene familias distintas para ellos, como PingFang SC frente a PingFang TC y PingFang HK en macOS, o Microsoft YaHei frente a Microsoft JhengHei en Windows. Por eso un perfil que declara una configuración regional de Taiwán debe incluir las familias de chino tradicional, y no solo las de chino simplificado.
El idioma importa tanto como la plataforma. Una máquina Windows configurada en inglés puede informar de pocas fuentes CJK, mientras que una configurada en chino informa de muchas. Por este motivo, la configuración regional CJK, la lista de fuentes CJK y el sistema operativo declarado deben coincidir. Si falta uno de los tres o apunta a otro lugar, la combinación resulta extraña aunque cada valor por separado sea verosímil.
Cadenas de sustitución y métricas de texto
Cuando una página pide una familia de fuentes que no está instalada, el navegador no se detiene. Recorre una cadena de sustitución, es decir, la lista ordenada de familias que prueba hasta que una cubre los caracteres del texto. La especificación CSS Fonts describe cómo funcionan las familias genéricas y la sustitución por carácter, y cada plataforma rellena esos mecanismos con sus propios valores predeterminados. El resultado es que el mismo CSS puede resolverse con fuentes distintas en sistemas distintos.
Las cadenas de sustitución típicas para el chino son estas.
- En Windows, el texto chino suele resolverse con Microsoft YaHei y después con SimSun.
- En macOS, suele resolverse con PingFang SC y después con STHeiti.
- En Linux, suele resolverse con una familia Noto Sans CJK o WenQuanYi, según lo que esté instalado.
Los autores de páginas suelen escribir una pila de fuentes, por ejemplo una familia de macOS primero, una de Windows después y una genérica al final. El navegador evalúa la pila de izquierda a derecha para cada carácter y usa la primera familia que está instalada y cubre ese carácter. El orden del propio CSS de la página decide, por tanto, qué familia instalada se hace visible, y una pila escrita para varias plataformas muestra de forma natural un resultado distinto en cada una.
Imagina una página que pide font-family: "Nonexistent Font", sans-serif y muestra texto chino. Nada en la página nombra una plataforma, pero los glifos finales proceden de una familia distinta en cada sistema, y las formas y el espaciado visibles cambian con ella. Una página no necesita la lista de fuentes instaladas para notar la diferencia. Solo necesita renderizar texto y observar el resultado.
El idioma del texto añade otra capa. El chino, el japonés y el coreano comparten muchos caracteres Han, pero las formas de glifo preferidas difieren según el idioma. Los navegadores usan el idioma declarado del contenido y los ajustes de idioma del sistema para elegir entre variantes regionales. Una configuración regional que declara japonés mientras la sustitución produce formas de glifo chinas es una incoherencia más que conviene evitar.
Más allá de la disponibilidad, las fuentes CJK producen diferencias medibles.
- Anchos de glifo: cada carácter, y en especial las cadenas que mezclan texto latino y CJK, tiene un ancho de avance distinto en cada familia.
- Altura de línea: el espaciado predeterminado entre líneas depende de las métricas verticales de la familia elegida.
- Reglas de espaciado: la puntuación, el kerning y el espaciado de caracteres siguen convenciones distintas en la tipografía china, japonesa y coreana.
- Hinting y rasterización: el aspecto a nivel de píxel del texto pequeño depende de los datos de hinting de la fuente y de DirectWrite en Windows, Core Text en macOS o FreeType en Linux.
Estos valores alimentan el diseño de la página. Llamadas como getBoundingClientRect() y getComputedStyle() devuelven números que dependen de la fuente realmente usada, y measureText de Canvas devuelve el ancho de una cadena en la fuente actual. MDN documenta measureText como una forma de obtener métricas de texto, y por eso también sirve para una comprobación sencilla: si el ancho de una cadena cambia al nombrar una familia, la familia se encontró, y si no cambia, el navegador recurrió a otra fuente.
Por qué las correcciones en el host dejan una brecha medible
Cuando un operador quiere una salida CJK distinta de la del host, hay tres enfoques habituales. Cada uno resuelve una parte del problema y deja abierta otra. Entender la brecha explica por qué un resultado coherente depende de alinear a la vez la lista de fuentes y el resultado del renderizado.
El primer enfoque es instalar en el host las fuentes CJK de la plataforma objetivo. En un servidor Linux puede significar añadir las fuentes básicas de Microsoft, paquetes CJK o archivos de fuente sueltos. Funciona con algunas páginas, pero tiene costes.
- Cambia el sistema operativo, de modo que todas las instancias del navegador en la máquina ven las nuevas fuentes, no solo la instancia que las necesita.
- Instalar juntas familias de Windows y de macOS produce una lista que no coincide con ninguna plataforma real.
- El renderizado sigue pasando por la pila de texto del host, como FreeType en Linux, y no por la de la plataforma que se quiere representar.
- Mantener las mismas fuentes instaladas en muchos servidores añade trabajo operativo y cuestiones de licencia.
El segundo enfoque es la inyección de fuentes web. Una página o un script añade fuentes mediante CSS para que el texto se dibuje con una familia elegida. Esto controla el aspecto de parte del texto, pero no cambia lo que informa el sistema. Una forma habitual de detectar una fuente es medir el texto con y sin la familia y comparar los anchos. Una fuente web inyectada puede renderizarse mientras la lista de fuentes del sistema sigue mostrando las fuentes reales del host, de modo que las dos vistas se contradicen.
El tercer enfoque es una extensión que intercepta llamadas de API relacionadas con fuentes y cambia la lista informada. La lista se puede editar, pero los píxeles no. Si la lista declara Microsoft YaHei mientras el texto lo dibuja en realidad una fuente FreeType del host, una medición en Canvas muestra un ancho que no pertenece a Microsoft YaHei. El valor informado y el valor observado no coinciden, y esa discrepancia es medible.
Los tres enfoques comparten una debilidad. Cambian una sola capa, ya sea la instalación, el estilo de la página o la lista informada, y dejan las demás como estaban. Un resultado CJK coherente necesita que la enumeración, el comportamiento de sustitución y el renderizado cambien juntos, porque una página puede comparar cualquier par de ellos.
Elegir un modo de fuentes para trabajo con CJK
BotBrowser documenta el manejo de fuentes mediante --bot-fonts, que tiene tres modos. El perfil incluye un paquete de fuentes de su plataforma objetivo, y el modo decide cómo se relaciona ese paquete con las fuentes del host. La documentación de fuentes de BotBrowser describe el paquete del perfil como el conjunto completo de fuentes estándar de la plataforma objetivo, y indica que los resultados de enumeración siguen lo que esa plataforma informaría.
--bot-fonts=profileusa el paquete de fuentes integrado en el perfil y es el valor predeterminado. Úsalo cuando el inventario del perfil y su comportamiento de sustitución deban seguir siendo la referencia.--bot-fonts=expandusa las fuentes del perfil y permite que el flujo de trabajo recurra a fuentes del host para los caracteres que el paquete no cubre. Úsalo solo cuando el flujo de trabajo permita esa sustitución de forma deliberada.--bot-fonts=realusa las fuentes reales del host. Úsalo para comparar o probar, y espera una salida que dependa del host porque no se aplica el paquete del perfil.
Para la mayoría de los flujos de trabajo CJK, profile es el punto de partida adecuado. Mantiene la disponibilidad de fuentes y la sustitución ligadas a la plataforma del perfil, de modo que un perfil de Windows con configuración regional china informa de Microsoft YaHei y SimSun incluso cuando el host es un servidor Linux sin esas fuentes. Eso elimina además la necesidad de instalar fuentes CJK en el host por el bien del perfil.
Un modo de fuentes es solo una parte de una configuración regional coherente. Combina un perfil CJK con la configuración regional, la lista de idiomas y la zona horaria de la misma región, como se describe en coherencia de zona horaria, configuración regional e idioma. Los parámetros figuran en la referencia de parámetros de la línea de comandos, junto con el nivel de plan de cada uno. A continuación hay tres ejemplos.
chrome --bot-profile="profiles/win11-zh-cn.enc" \
--bot-fonts=profile \
--bot-locale=zh-CN \
--bot-languages=zh-CN,zh,en \
--bot-timezone=Asia/Shanghai
chrome --bot-profile="profiles/win11-ja.enc" \
--bot-fonts=profile \
--bot-locale=ja-JP \
--bot-languages=ja,en \
--bot-timezone=Asia/Tokyo
chrome --bot-profile="profiles/win11-ko.enc" \
--bot-fonts=profile \
--bot-locale=ko-KR \
--bot-languages=ko,en \
--bot-timezone=Asia/Seoul
El modo expand merece una decisión cuidadosa. Resulta útil cuando una página contiene ideogramas poco comunes, símbolos o escrituras que el paquete del perfil no cubre, porque el host puede aportar un glifo en lugar de dejar un recuadro. El coste es que esos caracteres pasan a proceder de las fuentes del host, así que su resultado depende de la máquina. Elige expand solo cuando la cobertura completa importe más que la coincidencia estricta con la plataforma del perfil, y conserva profile para los flujos de trabajo en los que la coherencia sea el objetivo.
El propio perfil importa. Un perfil capturado en una instalación que ya usaba la configuración regional objetivo incluye las familias CJK que venían con esa configuración, así que conviene preferir perfiles capturados en una instalación con la configuración regional correspondiente. Un perfil capturado en una máquina solo en inglés no contendrá el conjunto completo de chino o japonés, y ningún parámetro puede añadir un paquete que el perfil no tiene. Cuando un flujo de trabajo necesite fuentes japonesas y chinas, usa un perfil capturado en un sistema que tuviera ambos paquetes de idioma. Para ejecutar un mismo perfil en distintos sistemas operativos en general, consulta perfiles de navegador multiplataforma.
Comprobar el resultado y conocer los límites
Una comparación sencilla de anchos confirma la disponibilidad básica de una fuente. Mide una cadena que mezcle letras latinas y caracteres CJK en la fuente que esperas y luego mide la misma cadena en una fuente de reserva como monospace. Si los anchos no coinciden, la familia indicada participó en el resultado; si coinciden, anota el caso como posible sustitución y contrástalo con otra familia. Usa una cadena mixta porque muchas familias CJK dan el mismo avance a cada ideograma, de modo que una cadena solo de ideogramas puede producir anchos iguales incluso con fuentes distintas. El siguiente fragmento se puede pegar en la consola de desarrollo de una página de prueba.
const ctx = document.createElement('canvas').getContext('2d');
const sample = 'Hello 你好 mmmlli';
ctx.font = '16px monospace';
const baseline = ctx.measureText(sample).width;
ctx.font = '16px "Microsoft YaHei", monospace';
const candidate = ctx.measureText(sample).width;
console.log({ baseline, candidate, found: candidate !== baseline });
Ejecuta la misma comprobación con algunas familias que pertenezcan a la plataforma objetivo del perfil y con algunas que no. Un perfil chino de Windows debería encontrar Microsoft YaHei y SimSun y no debería encontrar PingFang SC. Un perfil japonés de macOS debería encontrar Hiragino Sans y no debería encontrar Meiryo. Repite la comprobación en al menos dos sistemas operativos host con el mismo perfil. Si las respuestas cambian con el host, las fuentes del host se filtran en el resultado, y lo primero que debes confirmar es que --bot-fonts=profile está activado.
Mantén el significado del resultado en su justa medida. Una comparación de anchos muestra disponibilidad. No prueba que cada glifo, cada altura de línea y cada detalle de rasterización coincidan con los de una máquina real de la plataforma de origen. Trátala como una primera comprobación y complétala con una revisión visual de una página con mucho texto CJK en el idioma que te interese. Una rutina de revisión breve ayuda.
- Confirma que el perfil se capturó con la configuración regional y la plataforma que quieres representar.
- Confirma que la configuración regional, la lista de idiomas y la zona horaria apuntan a la misma región que el perfil.
- Ejecuta la comparación de anchos con familias que pertenecen a la plataforma objetivo y con familias que no.
- Abre una página con mucho texto chino, japonés o coreano y busca glifos ausentes o recuadros.
- Repite en un segundo sistema operativo host con el mismo perfil y compara las respuestas.
Los resultados inesperados suelen tener pocas causas. Los caracteres que aparecen como recuadros indican que el perfil no incluye el paquete de fuentes CJK de ese idioma, así que elige una versión de perfil que lo incluya. Los anchos de texto que difieren entre dos hosts indican que la versión de BotBrowser o el perfil son distintos, porque las actualizaciones de fuentes entre versiones pueden cambiar las métricas. El espaciado incoherente en texto que mezcla CJK y latino suele apuntar a diferencias de sustitución, así que confirma que la configuración de fuentes del perfil cubre ambas escrituras. Los caracteres poco comunes que se renderizan de otra manera pueden pasar a las fuentes del host. Puedes informar de ellos para que se añadan en futuras actualizaciones del paquete de fuentes, o usar expand si el flujo de trabajo permite deliberadamente esa sustitución por el host.
BotBrowser soporta --bot-fonts=profile, que usa el paquete de fuentes integrado en el perfil, de modo que la disponibilidad, la enumeración y la sustitución de fuentes CJK informadas siguen la plataforma objetivo del perfil en lugar de las fuentes instaladas en el host. En un flujo de trabajo CJK, esto permite comprobar que un perfil con configuración regional china, japonesa o coreana se mantiene coherente al ejecutarse en un sistema operativo host distinto. BotBrowser no puede garantizar que las comprobaciones propias de un sitio acepten la identidad, no puede sustituir un perfil capturado en una instalación con la configuración regional correspondiente y no controla las fuentes de la propia página, sus elecciones de sustitución en CSS ni el comportamiento de la plataforma en el servidor.
Conclusión práctica
Usa --bot-fonts=profile con un perfil capturado para la configuración regional CJK prevista y verifica la disponibilidad de fuentes y los anchos de texto mixto en más de un host. Trata el resultado como evidencia de coherencia, no como prueba de que cada glifo o detalle de rasterización coincide con una máquina física.
Fuentes públicas
- https://botbrowser.io/docs/fingerprint/font/ describe los modos de fuentes, los paquetes de fuentes integrados y el comportamiento de fuentes entre plataformas.
- https://www.w3.org/TR/css-fonts-4/ es la especificación CSS Fonts Module Level 4, que cubre la selección de fuentes y la sustitución.
- https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/measureText documenta la API de medición de texto de Canvas usada en la comparación de anchos.
Este artículo forma parte de la guía: Superficies de la plataforma web: mapa de revisión
Artículos Relacionados
¿Qué es la huella de fuentes? Coherencia de texto entre plataformas
Huella digitalCarga de fuentes web y estabilidad del diseño
Huella digitalFingerprinting por medicion de texto: rastreo subpixel
PlataformaPerfiles de navegador entre plataformas: una identidad en cada host
PlataformaEjecutar perfiles de navegador Windows en macOS y Linux
Huella digitalHuella de Canvas: cómo funciona y qué ayuda
Lleva BotBrowser de la investigación a producción
Usa estas guías para entender el modelo y después avanzar hacia validación multiplataforma, contextos aislados y despliegue de navegador preparado para escalar.