Rendu CJK : polices coherentes entre plateformes
Comment gerer les environnements de polices chinoises, japonaises et coreennes pour un rendu de profil coherent entre differentes plateformes et locales.
Vous préférez la doc produit maintenue ?
Cet article a une page équivalente dans le centre de documentation. Utilisez les docs pour le flux canonique, les flags à jour et la référence durable.
Introduction
Le rendu du texte chinois, japonais et coreen (CJK) est l'un des aspects les plus specifiques a chaque plateforme dans le comportement des navigateurs. Chaque systeme d'exploitation est livre avec des polices CJK differentes, des chaines de repli differentes et des moteurs de rendu differents qui produisent un resultat visuellement distinct. Windows utilise Microsoft YaHei pour le chinois simplifie, Meiryo pour le japonais et Malgun Gothic pour le coreen. macOS utilise PingFang pour le chinois, Hiragino Sans pour le japonais et Apple SD Gothic pour le coreen. Les distributions Linux s'appuient generalement sur les familles Noto Sans CJK ou WenQuanYi.
Ces differences sont importantes pour le fingerprinting des navigateurs, car la disponibilite des polices et le resultat du rendu constituent des signaux de plateforme forts. Les profils BotBrowser capturent l'environnement de polices complet du systeme source, garantissant un rendu CJK coherent quel que soit le systeme d'exploitation hote et quelles que soient les polices installees localement.
Impact sur la vie privee : pourquoi les polices CJK comptent
Le fingerprinting par les polices est l'une des methodes les plus fiables pour identifier la plateforme et la configuration d'un navigateur. En interrogeant la disponibilite de polices specifiques via CSS ou des operations Canvas, les systemes de suivi peuvent determiner le systeme d'exploitation, la configuration linguistique et meme certaines installations logicielles specifiques.
Les polices CJK sont particulierement revelatrices car :
- Elles sont volumineuses et specifiques a chaque plateforme. Les polices CJK de Windows ne sont pas disponibles sur macOS ou Linux, et inversement.
- Les systemes compatibles CJK possedent des dizaines de polices supplementaires par rapport aux installations exclusivement occidentales, ce qui fait de la liste des polices un signal distinctif puissant.
- Le resultat du rendu des polices (l'apparence reelle au niveau du pixel) differe de maniere mesurable entre DirectWrite (Windows), Core Text (macOS) et FreeType (Linux), meme lorsque le meme nom de famille de police est utilise.
Pour la recherche en matiere de protection de la vie privee ciblant les marches CJK, des environnements de polices precis sont essentiels. Un navigateur pretendant etre un systeme Windows en Chine mais ne disposant pas de Microsoft YaHei ou SimSun presente une incoherence evidente. De meme, un profil macOS ciblant le Japon sans Hiragino Sans echouerait aux verifications de coherence basees sur les polices.
Pour la gestion multi-comptes desservant les regions CJK, chaque identite a besoin d'un environnement de polices correspondant a sa combinaison plateforme/locale supposee.
Contexte technique
Familles de polices CJK par plateforme
Les polices CJK de Windows incluent :
- Chinois simplifie : Microsoft YaHei, SimSun, SimHei, FangSong, KaiTi, NSimSun
- Chinois traditionnel : Microsoft JhengHei, MingLiU, PMingLiU
- Japonais : Yu Gothic, Meiryo, MS Gothic, MS Mincho, MS PGothic
- Coreen : Malgun Gothic, Batang, Dotum, Gulim, Gungsuh
Les polices CJK de macOS incluent :
- Chinois simplifie : PingFang SC, STHeiti, STSong, STKaiti, STFangsong
- Chinois traditionnel : PingFang TC, PingFang HK, LiSong Pro
- Japonais : Hiragino Sans, Hiragino Kaku Gothic, Hiragino Mincho
- Coreen : Apple SD Gothic Neo, AppleMyungjo, Nanum Gothic
Les polices CJK de Linux incluent generalement :
- Toutes les langues : Noto Sans CJK (en variantes SC, TC, JP, KR), Noto Serif CJK
- Chinois : WenQuanYi Micro Hei, WenQuanYi Zen Hei
- Japonais : IPAGothic, IPAMincho, Takao Gothic
- Coreen : UnBatang, UnDotum
Chaines de repli des polices
Lorsqu'une page web specifie une police qui n'est pas disponible, le navigateur suit une chaine de repli. Cette chaine est specifique a la plateforme :
- Sur Windows, le repli pour le texte chinois passe generalement par Microsoft YaHei, puis SimSun
- Sur macOS, il passe par PingFang SC, puis STHeiti
- Sur Linux, il passe par Noto Sans CJK ou les familles WenQuanYi
Le comportement de repli specifique constitue un signal de fingerprinting. Si la page specifie font-family: "NonExistent Font", sans-serif, le texte rendu sera different sur chaque plateforme car la police de repli finale differe.
Metriques et rendu des polices
Au-dela de la simple disponibilite des polices, les polices CJK produisent des metriques differentes :
- Largeurs de glyphes : la largeur des caracteres individuels varie selon les familles de polices
- Hauteur de ligne : l'espacement par defaut entre les lignes differe selon les polices CJK
- Crenage et espacement : les regles d'espacement des caracteres different selon les conventions typographiques japonaises, chinoises et coreennes
- Hinting : le rendu au niveau du pixel des caracteres en petite taille depend des tables de hinting de la police et du moteur de rendu
Ces metriques affectent les calculs de mise en page, qui a leur tour affectent getBoundingClientRect(), getComputedStyle() et d'autres API de mesure utilisees par les systemes de suivi.
Approches courantes et leurs limites
Installer des polices CJK sur l'hote
L'approche la plus directe consiste a installer les polices CJK de la plateforme cible sur votre systeme hote. Pour un serveur Linux, cela signifie installer les polices de base Microsoft, les paquets de polices CJK ou ajouter manuellement des fichiers de polices. Cependant :
- Cela modifie la disponibilite des polices au niveau du systeme d'exploitation, affectant toutes les instances de navigateur et pas seulement des profils specifiques
- Avoir a la fois des polices CJK Windows et macOS installees simultanement cree une liste de polices qui ne correspond a aucune plateforme reelle
- Le rendu des polices utilise toujours le moteur de rendu du systeme hote (FreeType sur Linux), pas celui de la plateforme source
- La gestion des installations de polices sur plusieurs serveurs ajoute de la complexite operationnelle
Injection de polices web
Certaines approches injectent des polices web via CSS pour remplacer les polices systeme. Cela peut controler l'apparence visuelle du texte mais n'affecte pas les requetes d'enumeration des polices. La detection de polices basee sur JavaScript teste si une police est disponible en mesurant les changements de largeur du texte lorsque la police est specifiee. Les polices web injectees apparaissent dans le rendu mais peuvent ne pas etre correctement enregistrees lors de ces verifications d'enumeration.
Extensions de spoofing de polices
Les extensions de navigateur qui interceptent les appels d'API lies aux polices peuvent modifier la liste de polices rapportee. Cependant, elles ne peuvent pas modifier le resultat reel du rendu. Si la liste de polices rapportee indique que Microsoft YaHei est disponible mais que le rendu reel utilise FreeType avec une police differente, l'incoherence est mesurable via le rendu de texte Canvas.
L'approche de BotBrowser
Les profils BotBrowser capturent l'environnement de polices complet du systeme source. Cela inclut la disponibilite des polices, les caracteristiques de rendu et les metriques. Lorsqu'un profil CJK est charge sur n'importe quel systeme d'exploitation hote, les signaux lies aux polices correspondent exactement a l'environnement capture.
Environnement de polices base sur les profils
Chaque profil contient :
- La liste complete des polices disponibles sur le systeme source
- Les metriques de polices correspondant au moteur de rendu source
- Les caracteristiques de rendu de texte Canvas de la plateforme source
- Le comportement de repli CSS des polices correspondant au systeme d'exploitation source
Cela signifie qu'un profil Windows avec une locale chinoise rapporte correctement Microsoft YaHei, SimSun et d'autres polices CJK Windows, quelles que soient les polices installees sur l'hote.
Options de configuration des polices
BotBrowser fournit le flag --bot-config-fonts pour controler le comportement des polices :
# Utiliser l'environnement de polices integre au profil (par defaut)
--bot-config-fonts=profile
# Utiliser les polices du profil avec des polices de repli supplementaires
--bot-config-fonts=expand
# Utiliser les polices reelles du systeme hote
--bot-config-fonts=real
Le mode par defaut profile assure une coherence totale avec l'environnement capture. Le mode expand ajoute des polices de repli pour gerer les cas limites ou le jeu de polices du profil n'inclut pas un caractere specifique. Le mode real utilise les polices reelles du systeme hote, ce qui est utile pour les tests ou lorsque vous souhaitez le comportement de police de l'hote.
Coherence du rendu
BotBrowser controle non seulement la disponibilite des polices, mais aussi la maniere dont le texte est rendu. Le rendu de texte Canvas et les operations de mesure du texte produisent un resultat coherent avec la plateforme source du profil. Cela couvre a la fois l'apparence visuelle et les metriques programmatiques (boites englobantes, largeurs de texte) sur lesquelles repose le fingerprinting de polices.
Configuration et utilisation
Locale chinoise (simplifie)
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
Locale japonaise
chrome --bot-profile="/profiles/win11-ja.enc" \
--bot-config-locale=ja-JP \
--bot-config-languages=ja,en \
--bot-config-timezone=Asia/Tokyo
Locale coreenne
chrome --bot-profile="/profiles/win11-ko.enc" \
--bot-config-locale=ko-KR \
--bot-config-languages=ko,en \
--bot-config-timezone=Asia/Seoul
Exemple Playwright avec un profil 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');
// Verify CJK font rendering
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; // "Hello" in Chinese
return { width, font: ctx.font };
});
console.log('CJK font check:', fontCheck);
await browser.close();
})();
Identite CJK complete
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"}]'
Verification
Verifiez la gestion des polices CJK en controlant la disponibilite et le rendu des polices :
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');
// Test font availability through rendering width comparison
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('CJK font availability:', cjkVerification);
Bonnes pratiques
- Utilisez des profils captures a partir d'installations avec la locale correspondante. Un profil Windows capture a partir d'une installation en locale chinoise inclura toutes les polices CJK fournies avec cette configuration Windows specifique.
- Associez toujours les flags de locale, de langue et de fuseau horaire. Les profils CJK doivent inclure les flags
--bot-config-locale,--bot-config-languageset--bot-config-timezonecorrespondants pour une identite complete. - Utilisez des proxys regionaux. Associez les profils chinois a des proxys chinois, les profils japonais a des proxys japonais et les profils coreens a des proxys coreens.
- Preferez
--bot-config-fonts=profile(le reglage par defaut). Cela garantit que l'environnement de polices capture du profil est utilise exactement tel qu'il a ete capture. - Testez avec des pages riches en contenu CJK. Verifiez le rendu des polices sur des pages contenant un volume significatif de texte CJK pour confirmer que l'environnement de polices fonctionne correctement.
Questions frequentes
Dois-je installer des polices CJK sur mon serveur Linux ?
Non. Les profils BotBrowser contiennent l'environnement de polices du systeme source. Le profil determine quelles polices sont signalees comme disponibles, quelles que soient les polices installees sur l'hote.
Puis-je melanger des polices CJK et occidentales dans un meme profil ?
Oui. Tous les profils incluent a la fois des polices CJK et occidentales si elles etaient presentes sur le systeme source. Un profil Windows avec une locale chinoise inclut a la fois les polices chinoises et les polices occidentales standard comme Arial, Segoe UI et d'autres.
Comment fonctionne l'option --bot-config-fonts=expand ?
Le mode expand utilise le jeu de polices du profil comme source principale mais ajoute des polices de repli provenant du systeme hote. Cela est utile lorsque vous rencontrez des caracteres non couverts par le jeu de polices du profil, comme des symboles Unicode rares ou des ecritures absentes du systeme source.
Le rendu des polices dans Canvas correspond-il a la plateforme du profil ?
Oui. BotBrowser controle le rendu de texte Canvas au niveau du moteur. Le texte dessine sur Canvas avec des polices CJK produit un resultat coherent avec la plateforme source du profil, y compris les motifs d'anti-aliasing et les formes de glyphes.
Puis-je creer un profil avec a la fois des polices japonaises et chinoises ?
Les profils refletent la configuration du systeme source. Un systeme Windows avec les packs linguistiques japonais et chinois installes aura les deux jeux de polices dans son profil. Utilisez des profils captures a partir d'installations multilingues pour ce cas d'usage.
Comment verifier que les bonnes polices CJK sont utilisees ?
Utilisez la mesure de texte Canvas pour comparer les largeurs de rendu entre les polices CJK specifiees et les polices de repli. Si la police specifiee produit une largeur differente de celle de la police de repli, la police est disponible. Consultez la section Verification ci-dessus pour un exemple de code.
Resume
Le rendu des polices CJK dans BotBrowser est gere par des environnements de polices bases sur des profils captures a partir de systemes reels. Chaque profil contient la disponibilite complete des polices et les caracteristiques de rendu de sa plateforme source, garantissant un rendu de texte CJK coherent quel que soit le systeme d'exploitation hote et ses polices installees localement.
Pour des sujets connexes, consultez Font Fingerprinting pour une vue d'ensemble du fingerprinting par les polices, Cross-Platform Profiles pour l'execution de profils entre systemes d'exploitation, et Timezone, Locale, and Language pour la correspondance des parametres de locale avec les profils CJK.
Articles Connexes
Faites passer BotBrowser de la recherche à la production
Utilisez ces guides pour comprendre le modèle, puis passez à la validation multi-plateforme, aux contextes isolés et au déploiement navigateur prêt pour l'échelle.