Plataforma

Renderizado CJK: fuentes consistentes entre plataformas

Como manejar los entornos de fuentes chinas, japonesas y coreanas para obtener una salida de perfil consistente en diferentes plataformas y configuraciones regionales.

Documentación

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.

Introduccion

El renderizado de texto chino, japones y coreano (CJK) es uno de los aspectos mas especificos de plataforma en el comportamiento del navegador. Cada sistema operativo incluye diferentes fuentes CJK, diferentes cadenas de respaldo y diferentes motores de renderizado que producen resultados visiblemente distintos. Windows utiliza Microsoft YaHei para chino simplificado, Meiryo para japones y Malgun Gothic para coreano. macOS utiliza PingFang para chino, Hiragino Sans para japones y Apple SD Gothic para coreano. Las distribuciones Linux comunmente dependen de las familias Noto Sans CJK o WenQuanYi.

Estas diferencias son importantes para la huella digital del navegador porque la disponibilidad de fuentes y la salida de renderizado son senales fuertes de plataforma. Los perfiles de BotBrowser capturan el entorno completo de fuentes del sistema de origen, asegurando que el texto CJK se renderice de manera consistente independientemente del sistema operativo del host y de las fuentes instaladas localmente.

Impacto en la privacidad: por que importan las fuentes CJK

La identificacion por fuentes es uno de los metodos mas confiables para determinar la plataforma y configuracion de un navegador. Al consultar la disponibilidad de fuentes especificas a traves de operaciones CSS o Canvas, los sistemas de rastreo pueden determinar el sistema operativo, la configuracion de idioma e incluso instalaciones de software especificas.

Las fuentes CJK son particularmente reveladoras porque:

  • Son grandes y especificas de plataforma. Las fuentes CJK de Windows no estan disponibles en macOS o Linux, y viceversa.
  • Los sistemas compatibles con CJK tienen docenas de fuentes adicionales en comparacion con instalaciones solo occidentales, lo que convierte la lista de fuentes en una senal diferenciadora fuerte.
  • La salida de renderizado de fuentes (la apariencia real a nivel de pixel del texto) difiere de manera medible entre DirectWrite (Windows), Core Text (macOS) y FreeType (Linux), incluso cuando se utiliza el mismo nombre de familia de fuentes.

Para la investigacion de privacidad dirigida a mercados CJK, los entornos de fuentes precisos son esenciales. Un navegador que afirma ser un sistema Windows ejecutandose en China pero que carece de Microsoft YaHei o SimSun presenta una inconsistencia obvia. De manera similar, un perfil de macOS dirigido a Japon sin Hiragino Sans fallaria en las verificaciones de consistencia basadas en fuentes.

Para la gestion de multiples cuentas en regiones CJK, cada identidad necesita un entorno de fuentes que coincida con su supuesta combinacion de plataforma y configuracion regional.

Contexto tecnico

Familias de fuentes CJK por plataforma

Las fuentes CJK de Windows incluyen:

  • Chino simplificado: Microsoft YaHei, SimSun, SimHei, FangSong, KaiTi, NSimSun
  • Chino tradicional: Microsoft JhengHei, MingLiU, PMingLiU
  • Japones: Yu Gothic, Meiryo, MS Gothic, MS Mincho, MS PGothic
  • Coreano: Malgun Gothic, Batang, Dotum, Gulim, Gungsuh

Las fuentes CJK de macOS incluyen:

  • Chino simplificado: PingFang SC, STHeiti, STSong, STKaiti, STFangsong
  • Chino tradicional: PingFang TC, PingFang HK, LiSong Pro
  • Japones: Hiragino Sans, Hiragino Kaku Gothic, Hiragino Mincho
  • Coreano: Apple SD Gothic Neo, AppleMyungjo, Nanum Gothic

Las fuentes CJK de Linux comunmente incluyen:

  • Todos los idiomas: Noto Sans CJK (en variantes SC, TC, JP, KR), Noto Serif CJK
  • Chino: WenQuanYi Micro Hei, WenQuanYi Zen Hei
  • Japones: IPAGothic, IPAMincho, Takao Gothic
  • Coreano: UnBatang, UnDotum

Cadenas de respaldo de fuentes

Cuando una pagina web especifica una fuente que no esta disponible, el navegador sigue una cadena de respaldo. Esta cadena es especifica de la plataforma:

  • En Windows, el respaldo para texto chino tipicamente va a Microsoft YaHei, luego SimSun
  • En macOS, recurre a PingFang SC, luego STHeiti
  • En Linux, recurre a Noto Sans CJK o las familias WenQuanYi

El comportamiento especifico de respaldo es una senal de huella digital. Si la pagina especifica font-family: "NonExistent Font", sans-serif, el texto renderizado se vera diferente en cada plataforma porque la fuente de respaldo final difiere.

Metricas y renderizado de fuentes

Mas alla de la simple disponibilidad de fuentes, las fuentes CJK producen metricas diferentes:

  • Anchos de glifos: El ancho de caracteres individuales varia entre familias de fuentes
  • Altura de linea: El espaciado de linea predeterminado difiere entre fuentes CJK
  • Kerning y espaciado: Las reglas de espaciado de caracteres difieren entre las convenciones tipograficas japonesas, chinas y coreanas
  • Hinting: El renderizado a nivel de pixel de los caracteres en tamanos pequenos depende de las tablas de hinting de la fuente y del motor de renderizado

Estas metricas afectan los calculos de diseno, que a su vez afectan getBoundingClientRect(), getComputedStyle() y otras API de medicion que utilizan los sistemas de rastreo.

Enfoques comunes y sus limitaciones

Instalar fuentes CJK en el host

El enfoque mas directo es instalar las fuentes CJK de la plataforma objetivo en tu sistema host. Para un servidor Linux, esto significa instalar las fuentes principales de Microsoft, paquetes de fuentes CJK o agregar archivos de fuentes manualmente. Sin embargo:

  • Esto cambia la disponibilidad de fuentes a nivel del sistema operativo, afectando a todas las instancias del navegador, no solo a perfiles especificos
  • Tener fuentes CJK de Windows y macOS instaladas simultaneamente crea una lista de fuentes que no coincide con ninguna plataforma real
  • El renderizado de fuentes sigue utilizando el motor de renderizado del sistema host (FreeType en Linux), no el motor de la plataforma de origen
  • Gestionar instalaciones de fuentes en multiples servidores agrega complejidad operativa

Inyeccion de fuentes web

Algunos enfoques inyectan fuentes web a traves de CSS para sobreescribir las fuentes del sistema. Esto puede controlar la apariencia visual del texto pero no afecta las consultas de enumeracion de fuentes. La deteccion de fuentes basada en JavaScript prueba si una fuente esta disponible midiendo los cambios de ancho del texto cuando se especifica la fuente. Las fuentes web inyectadas aparecen en el renderizado pero pueden no registrarse correctamente en estas verificaciones de enumeracion.

Extensiones de suplantacion de fuentes

Las extensiones de navegador que interceptan llamadas a la API relacionadas con fuentes pueden modificar la lista de fuentes reportada. Sin embargo, no pueden cambiar la salida de renderizado real. Si la lista de fuentes reportada dice que Microsoft YaHei esta disponible pero el renderizado real usa FreeType con una fuente diferente, la inconsistencia es medible a traves del renderizado de texto en Canvas.

Enfoque de BotBrowser

Los perfiles de BotBrowser capturan el entorno completo de fuentes del sistema de origen. Esto incluye la disponibilidad de fuentes, las caracteristicas de renderizado y las metricas. Cuando se carga un perfil CJK en cualquier sistema operativo host, las senales relacionadas con fuentes coinciden exactamente con el entorno capturado.

Entorno de fuentes basado en perfiles

Cada perfil incluye:

  • La lista completa de fuentes disponibles del sistema de origen
  • Metricas de fuentes que coinciden con el motor de renderizado de origen
  • Caracteristicas de renderizado de texto en Canvas de la plataforma de origen
  • Comportamiento de respaldo de fuentes CSS que coincide con el sistema operativo de origen

Esto significa que un perfil de Windows con configuracion regional china reporta correctamente Microsoft YaHei, SimSun y otras fuentes CJK de Windows, independientemente de las fuentes instaladas en el host.

Opciones de configuracion de fuentes

BotBrowser proporciona la bandera --bot-config-fonts para controlar el comportamiento de las fuentes:

# Usar el entorno de fuentes integrado del perfil (predeterminado)
--bot-config-fonts=profile

# Usar fuentes del perfil con fuentes de respaldo adicionales
--bot-config-fonts=expand

# Usar las fuentes reales del sistema host
--bot-config-fonts=real

El modo profile predeterminado asegura una consistencia completa con el entorno capturado. El modo expand agrega fuentes de respaldo para manejar casos extremos donde el conjunto de fuentes del perfil no incluye un caracter especifico. El modo real utiliza las fuentes reales del sistema host, lo cual es util para pruebas o cuando deseas el comportamiento de fuentes del host.

Consistencia de renderizado

BotBrowser controla no solo la disponibilidad de fuentes sino tambien como se renderiza el texto. Las operaciones de renderizado de texto en Canvas y medicion de texto producen una salida consistente con la plataforma de origen del perfil. Esto cubre tanto la apariencia visual como las metricas programaticas (cuadros delimitadores, anchos de texto) en las que se basa la identificacion por fuentes.

Configuracion y uso

Configuracion regional china (simplificado)

chrome --bot-profile="/profiles/win11-zh-cn.enc" \
       --bot-config-locale=zh-CN \
       --bot-config-languages=zh-CN,zh,en \
       --bot-config-timezone=Asia/Shanghai

Configuracion regional japonesa

chrome --bot-profile="/profiles/win11-ja.enc" \
       --bot-config-locale=ja-JP \
       --bot-config-languages=ja,en \
       --bot-config-timezone=Asia/Tokyo

Configuracion regional coreana

chrome --bot-profile="/profiles/win11-ko.enc" \
       --bot-config-locale=ko-KR \
       --bot-config-languages=ko,en \
       --bot-config-timezone=Asia/Seoul

Ejemplo de Playwright con perfil CJK

const { chromium } = require('playwright-core');

(async () => {
  const browser = await chromium.launch({
    executablePath: '/path/to/botbrowser/chrome',
    args: [
      '--bot-profile=/profiles/win11-zh-cn.enc',
      '--bot-config-locale=zh-CN',
      '--bot-config-languages=zh-CN,zh,en',
      '--bot-config-timezone=Asia/Shanghai',
    ],
    headless: true,
  });

  const context = await browser.newContext();
  const page = await context.newPage();
  await page.goto('https://www.baidu.com');

  // Verificar el renderizado de fuentes CJK
  const fontCheck = await page.evaluate(() => {
    const canvas = document.createElement('canvas');
    const ctx = canvas.getContext('2d');
    ctx.font = '16px "Microsoft YaHei"';
    const width = ctx.measureText('\u4F60\u597D').width; // "Hola" en chino
    return { width, font: ctx.font };
  });
  console.log('Verificacion de fuentes CJK:', fontCheck);
  await browser.close();
})();

Identidad CJK completa

chrome --bot-profile="/profiles/win11-zh-cn.enc" \
       --bot-config-locale=zh-CN \
       --bot-config-languages=zh-CN,zh,en \
       --bot-config-timezone=Asia/Shanghai \
       --proxy-server=socks5://user:pass@cn-proxy:1080 \
       --bot-inject-random-history \
       --bot-bookmarks='[{"title":"\u767E\u5EA6","type":"url","url":"https://www.baidu.com"},{"title":"\u6DD8\u5B9D","type":"url","url":"https://www.taobao.com"}]'

Verificacion

Verifica el manejo de fuentes CJK comprobando la disponibilidad y el renderizado de fuentes:

const page = await context.newPage();
await page.goto('about:blank');

const cjkVerification = await page.evaluate(() => {
  const canvas = document.createElement('canvas');
  const ctx = canvas.getContext('2d');

  // Probar la disponibilidad de fuentes mediante comparacion de ancho de renderizado
  const testFonts = [
    'Microsoft YaHei', 'SimSun', 'SimHei',      // Windows CN
    'PingFang SC', 'STHeiti',                     // macOS CN
    'Meiryo', 'Yu Gothic', 'MS Gothic',          // Windows JP
    'Hiragino Sans',                              // macOS JP
    'Malgun Gothic',                              // Windows KR
  ];

  const results = {};
  const fallbackWidth = (() => {
    ctx.font = '16px monospace';
    return ctx.measureText('\u4F60\u597D').width;
  })();

  for (const font of testFonts) {
    ctx.font = `16px "${font}", monospace`;
    const width = ctx.measureText('\u4F60\u597D').width;
    results[font] = width !== fallbackWidth;
  }

  return results;
});

console.log('Disponibilidad de fuentes CJK:', cjkVerification);
Familias de fuentes CJK por plataforma Windows CN: Microsoft YaHei CN: SimSun, SimHei JP: Yu Gothic, Meiryo JP: MS Gothic KR: Malgun Gothic KR: Batang, Gulim macOS CN: PingFang SC CN: STHeiti, STSong JP: Hiragino Sans JP: Hiragino Mincho KR: Apple SD Gothic KR: AppleMyungjo Linux All: Noto Sans CJK All: Noto Serif CJK CN: WenQuanYi JP: IPAGothic KR: UnBatang KR: UnDotum

Mejores practicas

  • Usa perfiles capturados de instalaciones con la configuracion regional correspondiente. Un perfil de Windows capturado de una instalacion con configuracion regional china incluira todas las fuentes CJK que vienen con esa configuracion especifica de Windows.
  • Siempre combina las banderas de configuracion regional, idioma y zona horaria. Los perfiles CJK deben incluir las banderas --bot-config-locale, --bot-config-languages y --bot-config-timezone correspondientes para una identidad completa.
  • Usa proxies regionales. Combina perfiles chinos con proxies chinos, perfiles japoneses con proxies japoneses y perfiles coreanos con proxies coreanos.
  • Prefiere --bot-config-fonts=profile (el valor predeterminado). Esto asegura que el entorno de fuentes capturado del perfil se utilice exactamente como fue capturado.
  • Prueba con paginas con mucho contenido CJK. Verifica el renderizado de fuentes en paginas con contenido CJK sustancial para confirmar que el entorno de fuentes funciona correctamente.

Preguntas frecuentes

¿Necesito instalar fuentes CJK en mi servidor Linux?

No. Los perfiles de BotBrowser incluyen el entorno de fuentes del sistema de origen. El perfil determina que fuentes se reportan como disponibles, independientemente de lo que este instalado en el host.

¿Puedo mezclar fuentes CJK y occidentales en un solo perfil?

Si. Todos los perfiles incluyen tanto fuentes CJK como occidentales si estaban presentes en el sistema de origen. Un perfil de Windows con configuracion regional china incluye tanto fuentes chinas como fuentes occidentales estandar como Arial, Segoe UI y otras.

¿Como funciona la opcion --bot-config-fonts=expand?

El modo expand utiliza el conjunto de fuentes del perfil como fuente principal pero agrega fuentes de respaldo del sistema host. Esto es util cuando se encuentran caracteres no cubiertos por el conjunto de fuentes del perfil, como simbolos Unicode raros o scripts no presentes en el sistema de origen.

¿El renderizado de fuentes en Canvas coincide con la plataforma del perfil?

Si. BotBrowser controla el renderizado de texto en Canvas a nivel del motor. El texto dibujado en Canvas usando fuentes CJK produce una salida consistente con la plataforma de origen del perfil, incluyendo patrones de suavizado y formas de glifos.

¿Puedo crear un perfil con fuentes japonesas y chinas?

Los perfiles reflejan la configuracion del sistema de origen. Un sistema Windows con paquetes de idioma japones y chino instalados tendra ambos conjuntos de fuentes en su perfil. Usa perfiles capturados de instalaciones multiidioma para este caso de uso.

¿Como verifico que se estan usando las fuentes CJK correctas?

Usa la medicion de texto en Canvas para comparar los anchos de renderizado entre las fuentes CJK especificadas y las fuentes de respaldo. Si la fuente especificada produce un ancho diferente al de la fuente de respaldo, la fuente esta disponible. Consulta la seccion de Verificacion anterior para un ejemplo de codigo.

Resumen

El renderizado de fuentes CJK en BotBrowser se maneja a traves de entornos de fuentes basados en perfiles capturados de sistemas reales. Cada perfil incluye la disponibilidad completa de fuentes y las caracteristicas de renderizado de su plataforma de origen, asegurando una salida de texto CJK consistente independientemente del sistema operativo host y sus fuentes instaladas localmente.

Para temas relacionados, consulta Identificacion por fuentes para una vision general mas amplia de la identificacion por fuentes, Perfiles multiplataforma para ejecutar perfiles en diferentes sistemas operativos, y Zona horaria, configuracion regional e idioma para hacer coincidir la configuracion regional con perfiles CJK.

#Cjk#Fonts#Chinese#Japanese#Rendering

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.