Table des matières
Problèmes rencontrés
Téléchargement du code source jdk1.8 de Sun
Localisez le problème
问题解决
JVM逻辑字体映射配置
Linux安装字体
Maison Opération et maintenance exploitation et maintenance Linux Comment résoudre le problème des caractères chinois tronqués dans les fichiers Java Linux

Comment résoudre le problème des caractères chinois tronqués dans les fichiers Java Linux

Dec 14, 2021 pm 02:33 PM
java linux

Solutions aux caractères chinois tronqués dans les fichiers Java Linux : 1. Téléchargez le code source Sun de jdk1.8 ; 2. Modifiez la création de polices de polices physiques en polices logiques ;

Comment résoudre le problème des caractères chinois tronqués dans les fichiers Java Linux

L'environnement d'exploitation de cet article : système linux5.9.8, jdk1.8, ordinateur Dell G3.

Comment résoudre le problème des caractères chinois tronqués dans les fichiers Java Linux ?

Solution aux caractères chinois tronqués Java dans l'environnement Linux

Je crois que de nombreux amis ont rencontré le problème des caractères Java tronqués récemment. J'ai également résolu un problème de « processus d'utilisation de texte pour générer des images » « Les caractères chinois et spéciaux sont tronqués » ; j'ai passé beaucoup de temps à déboguer divers codes sources sous sun.font et sun.awt, et j'ai finalement compris le mécanisme et résolu le problème actuel. problème ; je vais maintenant vous donner le processus de résolution du problème. Notez-le et gardez une trace afin que vous ne le rencontriez plus à l'avenir.

Problèmes rencontrés

Voici le code que je souhaite exécuter (extrêmement simplifié, mais le sens reste le même) :

public static void main(String[] args) throws IOException {
   File file = new File("test.png");
   Font font = new Font("宋体", Font.PLAIN, 10);
   BufferedImage bi = new BufferedImage(400, 200, BufferedImage.TYPE_INT_ARGB);
   Graphics2D g2 = (Graphics2D) bi.getGraphics();
   g2.setBackground(Color.WHITE);
   g2.clearRect(0, 0, 400, 200);
   g2.setFont(font);
   g2.setColor(Color.BLACK);
   g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
   g2.drawString("为什么没有(ꐚꌒꑿꆺ)(ꐚꌒꑿꆺ)这名字特殊不?@¥¥¥ 为什么没有(ꐚꌒꑿꆺ)(ꐚꌒꑿꆺ)这名字特 ", 0, 10);
   g2.dispose();
   ImageIO.write(bi, PNG, file);
}
Copier après la connexion

Le but est bien sûr de voir la scène suivante à l'ouverture de test.png :

Après qu'il n'y ait eu aucun problème de débogage local, je l'ai mis sur la machine de test (Linux) et je l'ai exécuté. Les résultats d'exécution ont été incroyables :

Téléchargement du code source jdk1.8 de Sun

Suivez le. style cohérent des programmeurs : Puisqu'il y a un problème, alors Debug !
Le truc, c'est que le package de code source actuel ne contient plus le code du package sun !
Heureusement, Java a officiellement confirmé que le code d'OpenJDK est fondamentalement le même que le code source de la JVM. Vous pouvez le télécharger directement depuis OpenJDK8u : jdk8u

Quant à la façon d'utiliser le code source pour déboguer, je n'en parlerai pas. ... Ce n'est pas basique, alors ne lisez pas cet article

Localisez le problème

Téléchargez directement le code source, utilisez des points d'arrêt distants et exécutez-le sur le serveur. Lors du débogage, j'ai d'abord découvert le premier code causé. incohérence entre les serveurs locaux et de test :

Il s'avère que lorsque la JVM crée une police, elle utilisera FontManagerFactory pour l'obtenir, et différents systèmes utilisent différents FontManagers ! Mac utilise CFontManager, tandis que Linux utilise X11FontManager !

Alors, quelles sont les différences entre ces deux FontManagers ?

CFontManager créera CFont en tant que Font2D. Ce CFont est une classe créée par JVM spécifiquement pour Mac. En regardant les commentaires de la classe et de la méthode, vous pouvez savoir que parfois les polices physiques sont enveloppées par CFont dans l'environnement Mac, et c'est le cas. réalisé en code natif. :

Font2D créé par X11FontManager est une collection qui contient des polices logiques et des polices physiques. X11FontManager hérite de FcFontManager et FcFontManager hérite de SunFontManager ; jetons un coup d'œil à la méthode loadFonts() de X11FontManager, qui utilise directement la méthode loadFonts() de SunFontManager pour charger les polices physiques.

polices logiques et polices physiques

Le débogage du code ici a essentiellement confirmé qu'il s'agit d'un problème de chargement de polices dans différents environnements, donc les polices logiques trouvées lors du débogage de l'environnement Linux Et que sont les polices physiques ?

Polices physiques

Les polices physiques sont de véritables bibliothèques de polices qui contiennent des données de glyphes et des tableaux qui mappent des séquences de caractères à des séquences de glyphes à l'aide de technologies de police telles que TrueType ou PostScript Type 1. Toutes les implémentations de la plateforme Java prennent en charge les polices TrueType ; la prise en charge d'autres technologies de polices dépend de l'implémentation. Les polices physiques peuvent utiliser des noms de police tels que Helvetica, Palatino, HonMincho ou tout autre nom de police. En règle générale, chaque police physique ne prend en charge qu'un ensemble limité de systèmes d'écriture, par exemple uniquement les caractères latins ou uniquement le japonais et le latin de base. L'ensemble des polices physiques disponibles varie en fonction de la configuration. Les applications qui nécessitent des polices spécifiques peuvent utiliser la méthode createFont pour regrouper ces polices et les instancier.

Polices logiques

Les polices logiques sont cinq familles de polices définies par la plate-forme Java qui doivent être prises en charge par tous les environnements d'exécution Java : Serif, SansSerif, Monospaced, Dialog et DialogInput. Ces polices logiques ne sont pas de véritables bibliothèques de polices. De plus, c'est l'environnement d'exécution Java qui mappe les noms de polices logiques aux polices physiques. Les mappages dépendent de l'implémentation et généralement des paramètres régionaux, de sorte que l'apparence et les spécifications qu'ils fournissent varient. En règle générale, chaque nom de police logique est mappé sur plusieurs polices physiques afin de couvrir la vaste gamme de caractères.

问题解决

debug的源码很多,但是此次问题的关键点就在这里了,其它debug内容就不贴了。
既然已经确认了本地(mac环境)是native的代码帮我们做了物理字体的封装,转换成了CFont进行渲染,而Linux环境的X11FontManager只是帮我们加载了物理字体和逻辑字体,但是却需要我们自己进行选择,那么解决问题的第一步就显而易见了:将Font的创建从物理字体改为逻辑字体

1 //  Serif、SansSerif、Monospaced、Dialog 和 DialogInput 随意选择
2 Font font = new Font("Serif", Font.PLAIN, 10);
Copier après la connexion

改完以后执行代码,仍然是乱码!继续Debug,发现是Linux上逻辑字体Serif映射的物理字体没有中文字体和对应的特殊符号字体,这就很简单了,直接在Linux上安装中文字体(simsun.ttf),再安装特殊符号“ꐚꌒꑿꆺ”可显示的字体(mysi.ttf),将这两个字体也放到了jdk的fonts目录(JAVA_HOME/jre/lib/fonts)下。文章后面有Linux字体安装方法。

完成上面的改动之后,重启服务,再次执行成功显示!热烈庆祝~~~~

JVM逻辑字体映射配置

以上的改动已经可以解决中文和特殊字符乱码问题,但是我在Debug过程中发现在逻辑字体加载过程中,JVM会参考一个配置文件,代码在sun.awt.FontConfiguration中,这个配置类完成了逻辑字体和物理字体的映射,也指导了SunFontManager创建逻辑字体,而这个FontConfiguration读取的配置文件就是fontconfig.properties,这个配置文件目录是JAVA_HOME/jre/lib

查阅了一下资料,JVM字体配置文件的加载顺序如下:
JAVA_HOME/jre/lib/fontconfig.OS.Version.properties
JAVA_HOME/jre/lib/fontconfig.OS.Version.bfc
JAVA_HOME/jre/lib/fontconfig.OS.properties
JAVA_HOME/jre/lib/fontconfig.OS.bfc
JAVA_HOME/jre/lib/fontconfig.Version.properties
JAVA_HOME/jre/lib/fontconfig.Version.bfc
JAVA_HOME/jre/lib/fontconfig.properties
JAVA_HOME/jre/lib/fontconfig.bfc

OS是系统,例如:Linux、CentOs、RedHat等;Version是版本号

在这个配置文件中可以修改逻辑字体与物理字体的对应关系,也就是说可以手动的修改Serif、SansSerif、Monospaced、Dialog 和 DialogInput这五个逻辑字体在不同场景下所使用的真正物理字体。

举个栗子,下面的配置将serif.plain逻辑字体的中文使用simsun.ttf,拉丁文使用java自带字体:

# @(#)linux.fontconfig.SuSE.properties 1.2 03/10/17
#
# Copyright 2003 Sun Microsystems, Inc. All rights reserved.
#

# Version
version=1

# Component Font Mappings
serif.plain.chinese=-misc-simsun-medium-r-normal--*-%d-*-*-c-*-iso10646-1
serif.plain.latin-1=-b&h-lucidabright-medium-r-normal--*-%d-*-*-p-*-iso8859-1

# Search Sequences
sequence.allfonts=latin-1,chinese

# Exclusion Ranges

# Font File Names
filename.-misc-simsun-medium-r-normal--*-%d-*-*-c-*-iso10646-1=/usr/share/fonts/myfonts/simsun.ttf
Copier après la connexion

Linux安装字体

  • Linux字体目录:/usr/share/fonts
  • 在fonts下面新建一个目录,例如:mkdir myfonts
  • 将需要安装的字体放到新建目录下面,例如:cp ~/test/simsun.ttf /usr/share/fonts/myfonts
  • 进入到myfonts目录:cd /usr/share/fonts/myfonts
  • 执行如下命令:
    • mkfontscale
    • mkfontdir
    • fc-cache -fv
  • 查看是否已经安装对应的字体:fc-list
  • fc-cache -fv 命令用来刷新linux的字体缓存,使其立刻生效

PS:以上所有操作基本都需要root权限

推荐学习:《linux视频教程

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment utiliser Docker Desktop Comment utiliser Docker Desktop Apr 15, 2025 am 11:45 AM

Comment utiliser Docker Desktop? Docker Desktop est un outil pour exécuter des conteneurs Docker sur les machines locales. Les étapes à utiliser incluent: 1. Installer Docker Desktop; 2. Démarrer Docker Desktop; 3. Créer une image Docker (à l'aide de DockerFile); 4. Build Docker Image (en utilisant Docker Build); 5. Exécuter Docker Container (à l'aide de Docker Run).

Que faire si l'image Docker échoue Que faire si l'image Docker échoue Apr 15, 2025 am 11:21 AM

Dépannage des étapes pour la construction d'image Docker échouée: cochez la syntaxe Dockerfile et la version de dépendance. Vérifiez si le contexte de construction contient le code source et les dépendances requis. Affichez le journal de construction pour les détails d'erreur. Utilisez l'option - cibler pour créer une phase hiérarchique pour identifier les points de défaillance. Assurez-vous d'utiliser la dernière version de Docker Engine. Créez l'image avec --t [Image-Name]: Debug Mode pour déboguer le problème. Vérifiez l'espace disque et assurez-vous qu'il est suffisant. Désactivez SELINUX pour éviter les interférences avec le processus de construction. Demandez de l'aide aux plateformes communautaires, fournissez Dockerfiles et créez des descriptions de journaux pour des suggestions plus spécifiques.

Comment afficher le processus Docker Comment afficher le processus Docker Apr 15, 2025 am 11:48 AM

Méthode de visualisation du processus docker: 1. Commande Docker CLI: Docker PS; 2. Commande CLI Systemd: Docker d'état SystemCTL; 3. Docker Compose CLI Commande: Docker-Compose PS; 4. Process Explorer (Windows); 5. / Répertoire proc (Linux).

Explication détaillée du principe docker Explication détaillée du principe docker Apr 14, 2025 pm 11:57 PM

Docker utilise les fonctionnalités du noyau Linux pour fournir un environnement de fonctionnement d'application efficace et isolé. Son principe de travail est le suivant: 1. Le miroir est utilisé comme modèle en lecture seule, qui contient tout ce dont vous avez besoin pour exécuter l'application; 2. Le Système de fichiers Union (UnionFS) empile plusieurs systèmes de fichiers, ne stockant que les différences, l'économie d'espace et l'accélération; 3. Le démon gère les miroirs et les conteneurs, et le client les utilise pour l'interaction; 4. Les espaces de noms et les CGROUP implémentent l'isolement des conteneurs et les limitations de ressources; 5. Modes de réseau multiples prennent en charge l'interconnexion du conteneur. Ce n'est qu'en comprenant ces concepts principaux que vous pouvez mieux utiliser Docker.

Quelle configuration de l'ordinateur est requise pour VScode Quelle configuration de l'ordinateur est requise pour VScode Apr 15, 2025 pm 09:48 PM

Vs Code Système Exigences: Système d'exploitation: Windows 10 et supérieur, MacOS 10.12 et supérieur, processeur de distribution Linux: minimum 1,6 GHz, recommandé 2,0 GHz et au-dessus de la mémoire: minimum 512 Mo, recommandée 4 Go et plus d'espace de stockage: Minimum 250 Mo, recommandée 1 Go et plus d'autres exigences: connexion du réseau stable, xorg / wayland (Linux) recommandé et recommandée et plus

PHP vs Python: cas d'utilisation et applications PHP vs Python: cas d'utilisation et applications Apr 17, 2025 am 12:23 AM

PHP convient aux systèmes de développement Web et de gestion de contenu, et Python convient aux scripts de science des données, d'apprentissage automatique et d'automatisation. 1.Php fonctionne bien dans la création de sites Web et d'applications rapides et évolutifs et est couramment utilisé dans CMS tel que WordPress. 2. Python a permis de manière remarquable dans les domaines de la science des données et de l'apprentissage automatique, avec des bibliothèques riches telles que Numpy et Tensorflow.

Comment changer le mode chinois avec VScode Comment changer le mode chinois avec VScode Apr 15, 2025 pm 11:39 PM

VS Code pour changer le mode chinois: ouvrez l'interface des paramètres (Windows / Linux: Ctrl, macOS: CMD,) Recherchez des paramètres "Editor: Language" Sélectionnez "Chine

Qu'est-ce que VScode pour quoi est VScode? Qu'est-ce que VScode pour quoi est VScode? Apr 15, 2025 pm 06:45 PM

VS Code est le code Visual Studio Nom complet, qui est un éditeur de code multiplateforme gratuit et open source et un environnement de développement développé par Microsoft. Il prend en charge un large éventail de langages de programmation et fournit une mise en surbrillance de syntaxe, une complétion automatique du code, des extraits de code et des invites intelligentes pour améliorer l'efficacité de développement. Grâce à un écosystème d'extension riche, les utilisateurs peuvent ajouter des extensions à des besoins et des langues spécifiques, tels que les débogueurs, les outils de mise en forme de code et les intégrations GIT. VS Code comprend également un débogueur intuitif qui aide à trouver et à résoudre rapidement les bogues dans votre code.

See all articles