Jadual Kandungan
Masalah yang dihadapi
Muat turun kod sumber Sun bagi jdk1.8
Cari masalahnya
Fon logik dan fon fizikal
Fon Fizikal
Fon logik
问题解决
JVM逻辑字体映射配置
Linux安装字体
Rumah Operasi dan penyelenggaraan operasi dan penyelenggaraan linux Bagaimana untuk menyelesaikan masalah aksara Cina bercelaru dalam fail Java Linux

Bagaimana untuk menyelesaikan masalah aksara Cina bercelaru dalam fail Java Linux

Dec 14, 2021 pm 02:33 PM
java linux

Penyelesaian kepada aksara Cina yang kacau dalam fail Linux Java: 1. Muat turun kod sumber matahari jdk1.8 2. Tukar penciptaan fon daripada fon fizikal kepada fon logik 3. Mulakan semula perkhidmatan.

Bagaimana untuk menyelesaikan masalah aksara Cina bercelaru dalam fail Java Linux

Persekitaran pengendalian artikel ini: sistem linux5.9.8, jdk1.8, komputer Dell G3.

Bagaimana untuk menyelesaikan masalah aksara Cina bercelaru dalam fail Java Linux?

Penyelesaian untuk aksara bercelaru Cina Jawa dalam persekitaran Linux

Saya percaya ramai rakan yang saya temui watak bercelaru di Jawa Baru-baru ini, saya juga telah menyelesaikan masalah "aksara Cina yang kacau dan istimewa dalam proses menggunakan teks untuk menjana imej. Saya mengambil banyak masa untuk nyahpepijat pelbagai kod sumber di bawah sun.font dan sun.awt , akhirnya memahami mekanisme itu dan menyelesaikan masalah semasa sekarang tuliskan proses penyelesaian masalah dan buat rekod untuk mengelak daripada menghadapinya lagi pada masa hadapan.

Masalah yang dihadapi

Berikut ialah kod yang saya ingin laksanakan (amat dipermudahkan, tetapi maksudnya tetap sama):

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);
}
Salin selepas log masuk

Matlamatnya sudah tentu untuk open Apabila testing.png, saya melihat pemandangan berikut:

Selepas penyahpepijatan setempat tiada masalah, saya meletakkannya pada mesin ujian (Linux) dan melaksanakannya , hasil pelaksanaan sangat mengejutkan:

Muat turun kod sumber Sun bagi jdk1.8

Patuhi gaya pengaturcara yang konsisten: kerana terdapat masalah, maka Debug!
Caranya ialah pakej kod sumber semasa tidak lagi mengandungi kod pakej matahari!
Nasib baik, Java secara rasmi mengesahkan bahawa kod OpenJDK pada asasnya konsisten dengan kod sumber JVM Anda boleh memuat turunnya terus dari OpenJDK8u: jdk8u

Mengenai cara menggunakan kod sumber untuk nyahpepijat, saya menang. 'Jangan tulis tentangnya... Ini bukan perkara asas pun. Jangan baca artikel ini

Cari masalahnya

Muat turun kod sumber terus, gunakan titik putus jauh dan laksanakan pelayan. Semasa penyahpepijatan, saya mula-mula menemui kod pertama yang menyebabkan ketidakkonsistenan antara pelayan tempatan dan ujian:

Ternyata apabila JVM mencipta Font, ia akan menggunakan FontManagerFactory untuk mendapatkan FontManager, dan sistem yang berbeza menggunakan FontManagers yang berbeza! Mac menggunakan CfontManager, manakala Linux menggunakan X11FontManager!

Jadi apakah perbezaan antara kedua-dua FontManagers ini?

CFontManager akan mencipta Cfont sebagai Font2D CFont ini adalah kelas yang dicipta oleh JVM khusus untuk mac, anda boleh tahu bahawa kadangkala fon fizikal akan dibalut oleh Cfont dalam mac. persekitaran, dan ini dalam bahasa asli Selesai dalam kod:

Font2D yang dicipta oleh X11FontManager ialah koleksi yang mengandungi fon logik dan fon fizikal. X11FontManager mewarisi FcFontManager, dan FcFontManager mewarisi SunFontManager, mari kita lihat kaedah loadFonts() X11FontManager, yang secara langsung menggunakan kaedah loadFonts.LodFonts SunFontManager() SunFontManager kaedah caleFonts() Fon logik yang dimuatkan:

Fon logik dan fon fizikal

Nyahpepijat kod di sini Bian pada dasarnya telah mengesahkan bahawa ia adalah masalah memuatkan fon dalam persekitaran yang berbeza Jadi apakah fon logik dan fon fizikal yang ditemui semasa menyahpepijat persekitaran Linux?

Fon Fizikal

Fon fizikal ialah perpustakaan fon sebenar yang mengandungi data glif dan jadual yang memetakan jujukan aksara kepada jujukan glif menggunakan teknologi fon seperti TrueType atau PostScript Type 1 . Semua pelaksanaan Platform Java menyokong fon TrueType sokongan untuk teknologi fon lain adalah bergantung kepada pelaksanaan. Fon fizikal boleh menggunakan nama fon seperti Helvetica, Palatino, HonMincho atau sebarang nama fon lain. Biasanya, setiap fon fizikal hanya menyokong set sistem penulisan terhad, contohnya, hanya aksara Latin, atau hanya Jepun dan Latin Asas. Set fon fizikal yang tersedia berbeza-beza bergantung pada konfigurasi. Aplikasi yang memerlukan fon tertentu boleh menggunakan kaedah createFont untuk menggabungkan fon ini dan menjadikannya instantiate.

Fon logik

Fon logik ialah lima keluarga fon yang ditakrifkan oleh platform Java yang mesti disokong oleh semua persekitaran masa jalan Java: Serif, SansSerif, Monospaced, Dialog dan DialogInput. Fon logik ini bukan perpustakaan fon sebenar. Selain itu, persekitaran masa jalan Java yang memetakan nama fon logik kepada fon fizikal. Pemetaan adalah pelaksanaan dan secara amnya bergantung kepada tempat, jadi penampilan dan spesifikasi yang mereka sediakan berbeza-beza. Biasanya, setiap nama fon logik dipetakan kepada beberapa fon fizikal untuk merangkumi julat besar aksara.

问题解决

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

1 //  Serif、SansSerif、Monospaced、Dialog 和 DialogInput 随意选择
2 Font font = new Font("Serif", Font.PLAIN, 10);
Salin selepas log masuk

改完以后执行代码,仍然是乱码!继续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
Salin selepas log masuk

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视频教程

Atas ialah kandungan terperinci Bagaimana untuk menyelesaikan masalah aksara Cina bercelaru dalam fail Java Linux. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Cara menggunakan desktop docker Cara menggunakan desktop docker Apr 15, 2025 am 11:45 AM

Bagaimana cara menggunakan desktop Docker? Docktop Docktop adalah alat untuk menjalankan bekas Docker pada mesin tempatan. Langkah -langkah untuk digunakan termasuk: 1. Pasang desktop Docker; 2. Mulakan desktop Docker; 3. Buat imej Docker (menggunakan Dockerfile); 4. Membina imej Docker (menggunakan Docker Build); 5. Jalankan bekas Docker (menggunakan Docker Run).

Apa yang perlu dilakukan sekiranya imej docker gagal Apa yang perlu dilakukan sekiranya imej docker gagal Apr 15, 2025 am 11:21 AM

Langkah Penyelesaian Masalah untuk Gagal Docker Image Build: Semak Sintaks Dockerfile dan Versi Ketergantungan. Semak jika konteks binaan mengandungi kod sumber dan kebergantungan yang diperlukan. Lihat log binaan untuk butiran ralat. Gunakan pilihan sasaran untuk membina fasa hierarki untuk mengenal pasti titik kegagalan. Pastikan anda menggunakan versi terkini Enjin Docker. Bina imej dengan --t [nama imej]: mod debug untuk debug masalah. Semak ruang cakera dan pastikan ia mencukupi. Lumpuhkan Selinux untuk mengelakkan gangguan dengan proses binaan. Tanya platform komuniti untuk mendapatkan bantuan, sediakan dockerfiles dan bina deskripsi log untuk cadangan yang lebih spesifik.

Cara Melihat Proses Docker Cara Melihat Proses Docker Apr 15, 2025 am 11:48 AM

Kaedah Melihat Proses Docker: 1. Docker CLI Command: Docker PS; 2. Systemd CLI Command: Sistem Status SistemCTL; 3. Docker mengarang arahan CLI: Docker-Compose PS; 4 Proses Explorer (Windows); 5. /Direktori Proc (Linux).

Penjelasan terperinci mengenai Prinsip Docker Penjelasan terperinci mengenai Prinsip Docker Apr 14, 2025 pm 11:57 PM

Docker menggunakan ciri -ciri kernel Linux untuk menyediakan persekitaran berjalan yang cekap dan terpencil. Prinsip kerjanya adalah seperti berikut: 1. Cermin digunakan sebagai templat baca sahaja, yang mengandungi semua yang anda perlukan untuk menjalankan aplikasi; 2. Sistem Fail Kesatuan (Unionfs) menyusun pelbagai sistem fail, hanya menyimpan perbezaan, menjimatkan ruang dan mempercepatkan; 3. Daemon menguruskan cermin dan bekas, dan pelanggan menggunakannya untuk interaksi; 4. Ruang nama dan cgroups melaksanakan pengasingan kontena dan batasan sumber; 5. Pelbagai mod rangkaian menyokong interkoneksi kontena. Hanya dengan memahami konsep -konsep teras ini, anda boleh menggunakan Docker dengan lebih baik.

Konfigurasi komputer apa yang diperlukan untuk vscode Konfigurasi komputer apa yang diperlukan untuk vscode Apr 15, 2025 pm 09:48 PM

Keperluan Sistem Kod Vs: Sistem Operasi: Windows 10 dan ke atas, MACOS 10.12 dan ke atas, pemproses pengedaran Linux: minimum 1.6 GHz, disyorkan 2.0 GHz dan ke atas memori: minimum 512 MB, disyorkan 4 GB dan ke atas ruang penyimpanan: minimum 250 mb, disyorkan 1 GB dan di atas keperluan lain:

PHP vs Python: Gunakan Kes dan Aplikasi PHP vs Python: Gunakan Kes dan Aplikasi Apr 17, 2025 am 12:23 AM

PHP sesuai untuk pembangunan web dan sistem pengurusan kandungan, dan Python sesuai untuk sains data, pembelajaran mesin dan skrip automasi. 1.PHP berfungsi dengan baik dalam membina laman web dan aplikasi yang cepat dan berskala dan biasanya digunakan dalam CMS seperti WordPress. 2. Python telah melakukan yang luar biasa dalam bidang sains data dan pembelajaran mesin, dengan perpustakaan yang kaya seperti numpy dan tensorflow.

Cara menukar mod cina dengan vscode Cara menukar mod cina dengan vscode Apr 15, 2025 pm 11:39 PM

VS Kod untuk menukar mod Cina: Buka antara muka Tetapan (Windows/Linux: Ctrl, MacOS: CMD,) Cari "Editor: Bahasa" Tetapan Pilih "Cina" dalam menu drop-down Simpan tetapan dan mulakan semula kod vs

Apa itu vscode untuk apa vscode? Apa itu vscode untuk apa vscode? Apr 15, 2025 pm 06:45 PM

VS Kod adalah nama penuh Visual Studio Code, yang merupakan editor kod dan persekitaran pembangunan yang dibangunkan oleh Microsoft. Ia menyokong pelbagai bahasa pengaturcaraan dan menyediakan penonjolan sintaks, penyiapan automatik kod, coretan kod dan arahan pintar untuk meningkatkan kecekapan pembangunan. Melalui ekosistem lanjutan yang kaya, pengguna boleh menambah sambungan kepada keperluan dan bahasa tertentu, seperti debuggers, alat pemformatan kod, dan integrasi Git. VS Kod juga termasuk debugger intuitif yang membantu dengan cepat mencari dan menyelesaikan pepijat dalam kod anda.

See all articles