


Bagaimana untuk menyelesaikan masalah aksara Cina bercelaru dalam fail 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.
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); }
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);
改完以后执行代码,仍然是乱码!继续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
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!

Langkah -langkah untuk memasukkan mod pemulihan Linux adalah: 1. Mulakan semula sistem dan tekan kekunci khusus untuk memasukkan menu Grub; 2. Pilih pilihan dengan (pemulihanMode); 3. Pilih operasi dalam menu Mod Pemulihan, seperti FSCK atau Root. Mod pemulihan membolehkan anda memulakan sistem dalam mod pengguna tunggal, melakukan pemeriksaan sistem fail dan pembaikan, mengedit fail konfigurasi, dan operasi lain untuk membantu menyelesaikan masalah sistem.

Komponen teras Linux termasuk kernel, sistem fail, shell dan alat biasa. 1. Kernel menguruskan sumber perkakasan dan menyediakan perkhidmatan asas. 2. Sistem fail menganjurkan dan menyimpan data. 3. Shell adalah antara muka bagi pengguna untuk berinteraksi dengan sistem. 4. Alat umum membantu menyelesaikan tugas harian.

Struktur asas Linux termasuk kernel, sistem fail, dan shell. 1) Sumber perkakasan pengurusan kernel dan gunakan UNAME-R untuk melihat versi. 2) Sistem fail ext4 menyokong fail dan log besar dan dibuat menggunakan mkfs.ext4. 3) Shell menyediakan interaksi baris arahan seperti BASH, dan menyenaraikan fail menggunakan LS-L.

Langkah -langkah utama pengurusan dan penyelenggaraan sistem Linux termasuk: 1) menguasai pengetahuan asas, seperti struktur sistem fail dan pengurusan pengguna; 2) Menjalankan pemantauan sistem dan pengurusan sumber, gunakan alat atas, HTOP dan lain -lain; 3) Gunakan log sistem untuk menyelesaikan masalah, gunakan JournalCTL dan alat lain; 4) Tulis skrip automatik dan penjadualan tugas, gunakan alat Cron; 5) Melaksanakan pengurusan dan perlindungan keselamatan, konfigurasikan firewall melalui iptables; 6) Menjalankan pengoptimuman prestasi dan amalan terbaik, menyesuaikan parameter kernel dan mengembangkan tabiat yang baik.

Mod penyelenggaraan Linux dimasukkan dengan menambah init =/bin/bash atau parameter tunggal pada permulaan. 1. Masukkan Mod Penyelenggaraan: Edit menu Grub dan tambahkan parameter permulaan. 2. Mengembalikan sistem fail untuk membaca dan menulis mod: mount-oremount, rw/. 3. Membaiki sistem fail: Gunakan arahan FSCK, seperti FSCK/DEV/SDA1. 4. Menyokong data dan beroperasi dengan berhati -hati untuk mengelakkan kehilangan data.

Artikel ini membincangkan cara meningkatkan kecekapan pemprosesan data Hadoop pada sistem Debian. Strategi pengoptimuman meliputi peningkatan perkakasan, pelarasan parameter sistem operasi, pengubahsuaian konfigurasi Hadoop, dan penggunaan algoritma dan alat yang cekap. 1. Pengukuhan sumber perkakasan memastikan bahawa semua nod mempunyai konfigurasi perkakasan yang konsisten, terutama memberi perhatian kepada prestasi CPU, memori dan peralatan rangkaian. Memilih komponen perkakasan berprestasi tinggi adalah penting untuk meningkatkan kelajuan pemprosesan keseluruhan. 2. Sistem operasi Tunes deskriptor fail dan sambungan rangkaian: Ubah suai fail /etc/security/limits.conf untuk meningkatkan had atas deskriptor fail dan sambungan rangkaian yang dibenarkan dibuka pada masa yang sama oleh sistem. Pelarasan Parameter JVM: Laraskan fail Hadoop-env.sh

Panduan ini akan membimbing anda untuk belajar cara menggunakan syslog dalam sistem Debian. SYSLOG adalah perkhidmatan utama dalam sistem Linux untuk sistem pembalakan dan mesej log aplikasi. Ia membantu pentadbir memantau dan menganalisis aktiviti sistem untuk mengenal pasti dan menyelesaikan masalah dengan cepat. 1. Pengetahuan asas syslog Fungsi teras syslog termasuk: mengumpul dan menguruskan mesej log secara terpusat; menyokong pelbagai format output log dan lokasi sasaran (seperti fail atau rangkaian); Menyediakan fungsi tontonan log dan penapisan masa nyata. 2. Pasang dan konfigurasikan syslog (menggunakan rsyslog) Sistem Debian menggunakan rsyslog secara lalai. Anda boleh memasangnya dengan arahan berikut: sudoaptupdatesud

Apabila memilih versi Hadoop yang sesuai untuk sistem Debian, faktor utama berikut perlu dipertimbangkan: 1. Kestabilan dan sokongan jangka panjang: Bagi pengguna yang mengejar kestabilan dan keselamatan, disarankan untuk memilih versi stabil Debian, seperti Debian11 (Bullseye). Versi ini telah diuji sepenuhnya dan mempunyai kitaran sokongan sehingga lima tahun, yang dapat memastikan operasi sistem yang stabil. 2. Kelajuan Kemas Kini Pakej: Jika anda perlu menggunakan ciri dan ciri Hadoop terkini, anda boleh mempertimbangkan versi Debian yang tidak stabil (SID). Walau bagaimanapun, perlu diperhatikan bahawa versi yang tidak stabil mungkin mempunyai masalah keserasian dan risiko kestabilan. 3. Sokongan dan Sumber Masyarakat: Debian mempunyai sokongan masyarakat yang besar, yang dapat memberikan dokumentasi yang kaya dan


Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

SecLists
SecLists ialah rakan penguji keselamatan muktamad. Ia ialah koleksi pelbagai jenis senarai yang kerap digunakan semasa penilaian keselamatan, semuanya di satu tempat. SecLists membantu menjadikan ujian keselamatan lebih cekap dan produktif dengan menyediakan semua senarai yang mungkin diperlukan oleh penguji keselamatan dengan mudah. Jenis senarai termasuk nama pengguna, kata laluan, URL, muatan kabur, corak data sensitif, cangkerang web dan banyak lagi. Penguji hanya boleh menarik repositori ini ke mesin ujian baharu dan dia akan mempunyai akses kepada setiap jenis senarai yang dia perlukan.

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Muat turun versi mac editor Atom
Editor sumber terbuka yang paling popular

MinGW - GNU Minimalis untuk Windows
Projek ini dalam proses untuk dipindahkan ke osdn.net/projects/mingw, anda boleh terus mengikuti kami di sana. MinGW: Port Windows asli bagi GNU Compiler Collection (GCC), perpustakaan import yang boleh diedarkan secara bebas dan fail pengepala untuk membina aplikasi Windows asli termasuk sambungan kepada masa jalan MSVC untuk menyokong fungsi C99. Semua perisian MinGW boleh dijalankan pada platform Windows 64-bit.