Comment le rendu des polices CJK révèle votre système réel
Les familles de polices chinoises, japonaises et coréennes, leurs chaînes de repli et leurs métriques peuvent révéler l'hôte. Ce qui change et ce qu'exige un rendu cohérent.
BotBrowser Team
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.
BotBrowser peut aligner le lot et l'énumération de polices d'un profil autorisé pour les tests CJK, mais ne garantit pas l'acceptation par le site et ne contrôle ni son CSS, ni le chargement, ni le serveur.
TL;DR
TL;DR : La disponibilité, le repli et les métriques des polices CJK peuvent révéler le système hôte. BotBrowser peut aligner le lot de polices et l'énumération du profil pour des tests autorisés, mais ne garantit pas qu'un site accepte cette identité et ne contrôle ni le CSS de la page ni son serveur.
Les comparaisons du rendu CJK entre hôtes révèlent les limites qui restent hors du contrôle de BotBrowser.
Sommaire
- Pourquoi le texte CJK révèle la plateforme hôte
- Familles de polices CJK par plateforme
- Chaînes de repli et métriques de texte
- Pourquoi les corrections côté hôte laissent un écart mesurable
- Choisir un mode de polices pour le travail CJK
- Vérifier le résultat et connaître les limites
- Conclusion pratique
Pourquoi le texte CJK révèle la plateforme hôte
Le texte chinois, japonais et coréen est l'un des moyens les plus rapides pour une page de savoir sur quel système d'exploitation un navigateur s'exécute réellement. Chaque plateforme fournit ses propres familles de polices CJK, résout les polices absentes par sa propre chaîne de repli et dessine les glyphes avec sa propre pile de rendu de texte. Un profil qui paraît cohérent pour du texte latin peut tout de même laisser voir la plateforme hôte dès qu'une page mesure ou dessine des caractères d'Asie de l'Est.
La raison est simple. Des polices latines comme Arial ou Helvetica existent sur plusieurs systèmes, donc une liste qui les contient dit peu de choses. Les polices CJK sont volumineuses, liées à un éditeur et installées selon les modules de langue du système. Une liste qui contient Microsoft YaHei indique Windows. Une liste qui contient PingFang SC indique macOS. Une liste qui contient Noto Sans CJK et WenQuanYi indique un poste de travail ou un serveur Linux typique.
Les sections ci-dessous examinent ce que le rendu CJK expose, pourquoi les corrections habituelles côté hôte laissent un écart mesurable et ce qu'exige un rendu cohérent entre plateformes. Elles montrent aussi comment choisir un mode --bot-fonts pour un flux de travail CJK et comment vérifier le résultat par une courte comparaison de largeurs avec Canvas. Pour une vue plus large des signaux de polices, consultez les empreintes de polices et la cohérence du texte entre plateformes.
Familles de polices CJK par plateforme
Les listes ci-dessous sont des exemples représentatifs, pas des inventaires complets. Les installations réelles varient selon la version du système d'exploitation, les modules de langue installés et les polices ajoutées par l'utilisateur ou un administrateur. Servez-vous-en pour comprendre quelles familles appartiennent habituellement à quelle plateforme, pas comme une liste de contrôle que chaque machine devrait satisfaire.
Windows fournit généralement ces familles CJK.
- Chinois simplifié : Microsoft YaHei, SimSun, SimHei, FangSong, KaiTi, NSimSun
- Chinois traditionnel : Microsoft JhengHei, MingLiU, PMingLiU
- Japonais : Yu Gothic, Meiryo, MS Gothic, MS Mincho, MS PGothic
- Coréen : Malgun Gothic, Batang, Dotum, Gulim, Gungsuh
macOS fournit généralement ces familles CJK.
- Chinois simplifié : PingFang SC, STHeiti, STSong, STKaiti, STFangsong
- Chinois traditionnel : PingFang TC, PingFang HK, LiSong Pro
- Japonais : Hiragino Sans, Hiragino Kaku Gothic, Hiragino Mincho
- Coréen : Apple SD Gothic Neo, AppleMyungjo, Nanum Gothic
Les distributions Linux fournissent généralement ces familles CJK, selon les paquets installés.
- Les trois langues : Noto Sans CJK (variantes SC, TC, JP et KR) et Noto Serif CJK
- Chinois : WenQuanYi Micro Hei, WenQuanYi Zen Hei
- Japonais : IPAGothic, IPAMincho, Takao Gothic
- Coréen : UnBatang, UnDotum
La conséquence pratique est un ensemble d'incohérences que l'on reconnaît au premier regard. Un profil qui annonce Windows avec une locale chinoise mais ne signale ni Microsoft YaHei ni SimSun est incohérent, car une installation chinoise de Windows les fournit par défaut. Un profil macOS destiné au Japon qui n'a pas Hiragino Sans est incohérent de la même façon. Une machine Linux qui signale des polices Windows à côté de polices Apple ne correspond à aucune installation réelle, puisque ces familles ne viennent jamais d'un même éditeur.
La région compte aussi à l'intérieur du chinois. Le chinois simplifié est la norme en Chine continentale, tandis que le chinois traditionnel est utilisé à Taïwan et à Hong Kong, et chaque plateforme possède des familles distinctes pour eux, comme PingFang SC face à PingFang TC et PingFang HK sur macOS, ou Microsoft YaHei face à Microsoft JhengHei sur Windows. Un profil qui annonce une locale de Taïwan doit donc comporter les familles de chinois traditionnel, et pas seulement celles du chinois simplifié.
La langue compte autant que la plateforme. Une machine Windows configurée en anglais peut signaler peu de polices CJK, alors qu'une machine configurée en chinois en signale beaucoup. Pour cette raison, une locale CJK, une liste de polices CJK et le système d'exploitation annoncé doivent concorder. Si l'un des trois manque ou pointe ailleurs, la combinaison paraît inhabituelle même quand chaque valeur prise isolément est plausible.
Chaînes de repli et métriques de texte
Lorsqu'une page demande une famille de polices qui n'est pas installée, le navigateur ne s'arrête pas. Il parcourt une chaîne de repli, c'est-à-dire la liste ordonnée de familles qu'il essaie jusqu'à ce que l'une couvre les caractères du texte. La spécification CSS Fonts décrit le fonctionnement des familles génériques et du repli par caractère, et chaque plateforme remplit ces mécanismes avec ses propres valeurs par défaut. Le même CSS peut donc aboutir à des polices différentes selon les systèmes.
Voici des chaînes de repli typiques pour le chinois.
- Sous Windows, le texte chinois se résout généralement en Microsoft YaHei, puis en SimSun.
- Sous macOS, il se résout généralement en PingFang SC, puis en STHeiti.
- Sous Linux, il se résout généralement en une famille Noto Sans CJK ou WenQuanYi, selon ce qui est installé.
Les auteurs de pages écrivent généralement une pile de polices, par exemple une famille macOS d'abord, une famille Windows ensuite et une famille générique en dernier. Le navigateur évalue la pile de gauche à droite pour chaque caractère et utilise la première famille installée qui couvre ce caractère. L'ordre du CSS de la page décide donc quelle famille installée devient visible, et une pile écrite pour plusieurs plateformes donne naturellement un résultat différent sur chacune.
Imaginez une page qui demande font-family: "Nonexistent Font", sans-serif et affiche du texte chinois. Rien dans la page ne nomme une plateforme, pourtant les glyphes finaux proviennent d'une famille différente sur chaque système, et les formes et l'espacement visibles changent avec elle. Une page n'a pas besoin de la liste des polices installées pour remarquer la différence. Il lui suffit de rendre du texte et d'observer le résultat.
La langue du texte ajoute une autre couche. Le chinois, le japonais et le coréen partagent de nombreux caractères Han, mais les formes de glyphes préférées diffèrent selon la langue. Les navigateurs utilisent la langue déclarée du contenu et les réglages de langue du système pour choisir entre des variantes régionales. Une locale qui annonce le japonais alors que le repli produit des formes de glyphes chinoises est une incohérence de plus à éviter.
Au-delà de la disponibilité, les polices CJK produisent des différences mesurables.
- Largeurs de glyphes : chaque caractère, et surtout les chaînes qui mêlent latin et CJK, a une chasse différente selon la famille.
- Hauteur de ligne : l'espacement par défaut entre les lignes dépend des métriques verticales de la famille choisie.
- Règles d'espacement : la ponctuation, le crénage et l'espacement des caractères suivent des conventions différentes dans la typographie chinoise, japonaise et coréenne.
- Hinting et rastérisation : l'aspect au pixel près du petit texte dépend des données de hinting de la police et de DirectWrite sous Windows, de Core Text sous macOS ou de FreeType sous Linux.
Ces valeurs alimentent la mise en page. Des appels comme getBoundingClientRect() et getComputedStyle() renvoient des nombres qui dépendent de la police réellement utilisée, et measureText de Canvas renvoie la largeur d'une chaîne dans la police courante. MDN documente measureText comme un moyen d'obtenir des métriques de texte, ce qui le rend aussi utile pour une vérification simple : si la largeur d'une chaîne change après qu'une famille a été nommée, la famille a été trouvée, et si elle ne change pas, le navigateur est passé à une autre police.
Pourquoi les corrections côté hôte laissent un écart mesurable
Trois approches sont courantes lorsqu'un opérateur veut un rendu CJK différent de celui de l'hôte. Chacune résout une partie du problème et en laisse une autre ouverte. Comprendre l'écart explique pourquoi un rendu cohérent exige d'aligner ensemble la liste des polices et le résultat du rendu.
La première approche consiste à installer sur l'hôte les polices CJK de la plateforme cible. Sur un serveur Linux, cela peut signifier ajouter les polices de base de Microsoft, des paquets CJK ou des fichiers de polices isolés. Cela fonctionne pour certaines pages, mais a des coûts.
- Cela modifie le système d'exploitation, si bien que toutes les instances du navigateur sur la machine voient les nouvelles polices, pas seulement celle qui en a besoin.
- Installer ensemble des familles Windows et macOS produit une liste qui ne correspond à aucune plateforme réelle.
- Le rendu passe toujours par la pile de texte de l'hôte, comme FreeType sous Linux, et non par celle de la plateforme représentée.
- Garder les mêmes polices installées sur de nombreux serveurs ajoute du travail d'exploitation et des questions de licence.
La deuxième approche est l'injection de polices web. Une page ou un script ajoute des polices par CSS pour que le texte soit dessiné avec une famille choisie. Cela contrôle l'apparence d'une partie du texte, mais ne change pas ce que le système signale. Une façon courante de détecter une police consiste à mesurer le texte avec et sans la famille et à comparer les largeurs. Une police web injectée peut être rendue alors que la liste des polices du système montre toujours les vraies polices de l'hôte, de sorte que les deux vues se contredisent.
La troisième approche est une extension qui intercepte les appels d'API liés aux polices et modifie la liste signalée. La liste peut être modifiée, mais pas les pixels. Si la liste annonce Microsoft YaHei alors que le texte est en réalité dessiné par une police FreeType de l'hôte, une mesure Canvas donne une largeur qui n'appartient pas à Microsoft YaHei. La valeur signalée et la valeur observée divergent, et cette divergence est mesurable.
Les trois approches partagent une même faiblesse. Elles modifient une seule couche, soit l'installation, soit le style de la page, soit la liste signalée, et laissent les autres telles quelles. Un rendu CJK cohérent exige que l'énumération, le comportement de repli et le rendu évoluent ensemble, car une page peut comparer n'importe quelles deux de ces couches.
Choisir un mode de polices pour le travail CJK
BotBrowser documente la gestion des polices par --bot-fonts, qui propose trois modes. Le profil embarque un lot de polices pour sa plateforme cible, et le mode décide de la relation entre ce lot et les polices de l'hôte. La documentation des polices de BotBrowser décrit le lot du profil comme l'ensemble complet des polices standard de la plateforme cible, et indique que les résultats d'énumération suivent ce que cette plateforme signalerait.
--bot-fonts=profileutilise le lot de polices embarqué dans le profil et constitue la valeur par défaut. Utilisez-le lorsque l'inventaire du profil et son comportement de repli doivent rester la référence.--bot-fonts=expandutilise les polices du profil et permet au flux de travail de se replier sur les polices de l'hôte pour les caractères que le lot ne couvre pas. Utilisez-le uniquement lorsque le flux de travail autorise ce repli de façon délibérée.--bot-fonts=realutilise les vraies polices de l'hôte. Utilisez-le pour comparer ou tester, et attendez-vous à un rendu dépendant de l'hôte puisque le lot du profil n'est pas appliqué.
Pour la plupart des flux de travail CJK, profile est le bon point de départ. Il garde la disponibilité des polices et le repli liés à la plateforme du profil, de sorte qu'un profil Windows avec une locale chinoise signale Microsoft YaHei et SimSun même lorsque l'hôte est un serveur Linux sans ces polices. Cela supprime aussi le besoin d'installer des polices CJK sur l'hôte pour les besoins du profil.
Un mode de polices n'est qu'une partie d'une configuration régionale cohérente. Associez un profil CJK à la locale, à la liste de langues et au fuseau horaire de la même région, comme décrit dans la cohérence du fuseau horaire, de la locale et de la langue. Les paramètres figurent dans la référence des paramètres de ligne de commande, avec le niveau de forfait de chacun. Voici trois exemples.
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
Le mode expand demande une décision réfléchie. Il est utile lorsqu'une page contient des idéogrammes rares, des symboles ou des écritures que le lot du profil ne couvre pas, car l'hôte peut fournir un glyphe au lieu de laisser un rectangle vide. Le coût est que ces caractères proviennent désormais des polices de l'hôte, si bien que leur rendu dépend de la machine. Choisissez expand uniquement lorsque la couverture complète compte plus que la concordance stricte avec la plateforme du profil, et gardez profile pour les flux de travail où la cohérence est l'objectif.
Le profil lui-même compte. Un profil capturé sur une installation qui utilisait déjà la locale cible comporte les familles CJK livrées avec cette configuration, donc privilégiez les profils capturés sur une installation de la locale correspondante. Un profil capturé sur une machine uniquement anglophone ne contiendra pas l'ensemble complet du chinois ou du japonais, et aucun paramètre ne peut ajouter un lot que le profil n'a pas. Lorsqu'un flux de travail a besoin de polices japonaises et chinoises, utilisez un profil capturé sur un système qui avait les deux modules de langue. Pour l'exécution d'un même profil sur plusieurs systèmes d'exploitation en général, consultez les profils de navigateur multiplateformes.
Vérifier le résultat et connaître les limites
Une simple comparaison de largeurs confirme la disponibilité de base d'une police. Mesurez une chaîne qui mêle lettres latines et caractères CJK dans la police attendue, puis mesurez la même chaîne dans une police de secours comme monospace. Si les deux largeurs diffèrent, la famille nommée a été trouvée. Si elles sont égales, le navigateur est passé à une autre police. Utilisez une chaîne mixte, car de nombreuses familles CJK donnent la même chasse à chaque idéogramme, si bien qu'une chaîne composée uniquement d'idéogrammes peut produire des largeurs égales même avec des polices différentes. L'extrait suivant peut être collé dans la console de développement d'une page de test.
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 });
Exécutez la même vérification pour quelques familles qui appartiennent à la plateforme cible du profil et pour quelques-unes qui n'y appartiennent pas. Un profil Windows chinois devrait trouver Microsoft YaHei et SimSun et ne devrait pas trouver PingFang SC. Un profil macOS japonais devrait trouver Hiragino Sans et ne devrait pas trouver Meiryo. Répétez la vérification sur au moins deux systèmes d'exploitation hôtes avec le même profil. Si les réponses changent avec l'hôte, les polices de l'hôte fuient dans le résultat, et la première chose à confirmer est que --bot-fonts=profile est défini.
Gardez la portée du résultat en perspective. Une comparaison de largeurs montre la disponibilité. Elle ne prouve pas que chaque glyphe, chaque hauteur de ligne et chaque détail de rastérisation correspondent à ceux d'une vraie machine de la plateforme d'origine. Considérez-la comme une première vérification et complétez-la par un examen visuel d'une page riche en texte CJK dans la langue qui vous intéresse. Une courte routine de revue est utile.
- Confirmez que le profil a été capturé avec la locale et la plateforme que vous voulez représenter.
- Confirmez que la locale, la liste de langues et le fuseau horaire pointent vers la même région que le profil.
- Exécutez la comparaison de largeurs pour des familles qui appartiennent à la plateforme cible et pour des familles qui n'y appartiennent pas.
- Ouvrez une page contenant beaucoup de texte chinois, japonais ou coréen et cherchez des glyphes manquants ou des rectangles vides.
- Répétez sur un deuxième système d'exploitation hôte avec le même profil et comparez les réponses.
Les résultats inattendus ont généralement peu de causes. Des caractères qui apparaissent comme des rectangles indiquent que le profil n'inclut pas le lot de polices CJK de cette langue, donc choisissez une version de profil qui l'inclut. Des largeurs de texte différentes entre deux hôtes indiquent que la version de BotBrowser ou le profil diffère, car les mises à jour de polices entre versions peuvent modifier les métriques. Un espacement incohérent dans un texte mêlant CJK et latin pointe généralement vers des différences de repli, donc vérifiez que la configuration de polices du profil couvre les deux écritures. Des caractères rares rendus différemment peuvent retomber sur les polices de l'hôte. Vous pouvez les signaler afin qu'ils soient ajoutés lors de futures mises à jour du lot de polices, ou utiliser expand si le flux de travail autorise délibérément le repli sur l'hôte.
BotBrowser prend en charge --bot-fonts=profile, qui utilise le lot de polices embarqué dans le profil, de sorte que la disponibilité, l'énumération et le repli des polices CJK signalés suivent la plateforme cible du profil plutôt que les polices installées sur l'hôte. Pour un flux de travail CJK, cela permet de vérifier qu'un profil de locale chinoise, japonaise ou coréenne reste cohérent lorsqu'il s'exécute sur un autre système d'exploitation hôte. BotBrowser ne peut pas garantir que les vérifications propres à un site acceptent l'identité, ne remplace pas un profil capturé sur une installation de la locale correspondante et ne contrôle pas les polices de la page elle-même, ses choix de repli CSS ni le comportement de la plateforme côté serveur.
Conclusion pratique
Utilisez --bot-fonts=profile avec un profil capturé pour la locale CJK visée, puis vérifiez la disponibilité des polices et les largeurs de texte mixte sur plusieurs hôtes. Considérez le résultat comme une preuve de cohérence, pas comme la preuve que chaque glyphe ou détail de rastérisation correspond à une machine physique.
Sources publiques
- https://botbrowser.io/docs/fingerprint/font/ décrit les modes de polices, les lots de polices embarqués et le comportement des polices entre plateformes.
- https://www.w3.org/TR/css-fonts-4/ est la spécification CSS Fonts Module Level 4, qui couvre la sélection des polices et le repli.
- https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/measureText documente l'API de mesure de texte de Canvas utilisée pour la comparaison de largeurs.
Cet article fait partie du guide : Surfaces de la plateforme web : carte de revue
Articles Connexes
Qu'est-ce que l'empreinte des polices ? Cohérence du texte
EmpreinteChargement des polices web et stabilité de la mise en page
EmpreinteFingerprinting par mesure de texte : suivi sous-pixel
PlateformeProfils navigateur multi-plateforme : une identité sur chaque hôte
PlateformeExécuter des profils de navigateur Windows sur macOS et Linux
EmpreinteEmpreinte Canvas : fonctionnement et solutions
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.