广告
返回顶部
首页 > 资讯 > 操作系统 >java linux文件出现中文乱码怎么办
  • 703
分享到

java linux文件出现中文乱码怎么办

2023-06-22 02:06:41 703人浏览 八月长安
摘要

这篇文章给大家分享的是有关java linux文件出现中文乱码怎么办的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。java linux文件中文乱码的解决办法:1、下载jdk1.8的sun源码;2、将Font的创建

这篇文章给大家分享的是有关java linux文件出现中文乱码怎么办的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

java linux文件中文乱码的解决办法:1、下载jdk1.8的sun源码;2、将Font的创建从物理字体改为逻辑字体;3、重启服务即可。

本文操作环境:linux5.9.8系统,jdk1.8,Dell G3电脑。

Linux环境下Java中文乱码解决方案

相信很多朋友遇到过Java的乱码问题,最近我也在解决一个“使用文本生成图片过程中中文以及特殊字符乱码”的问题;花了我大量时间,Debug了sun.font、sun.awt下面的各种源码,终于搞懂了其机制,解决了目前次问题;现在把问题解决过程给写下来,做个记录,以免以后再次遇到。

遇到的问题

下面是我想要执行的代码(经过极度简化,但是意思没变):

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);}

目标当然是想在打开test.png的时候看到如下场景:

java linux文件出现中文乱码怎么办

在本地调试没问题之后,就放到了测试机(Linux)上面去执行了,执行结果简直扑街:

java linux文件出现中文乱码怎么办

jdk1.8的sun源码下载

奉行程序员一贯作风:既然有问题,那就Debug!
坑爹的是现在的源码包已经不包含sun包的代码了!
幸好java官方确认OpenJDK的代码基本和JVM源码一致,可以直接从OpenJDK8u进行下载:jdk8u

至于如何使用源码debug,这个就不写了··· 这都不会基本也就别看这文章了

定位问题

直接下载好源码,远程断点,服务器执行,在debug中先发现了第一个产生本地和测试服务器不一致的代码:
java linux文件出现中文乱码怎么办

原来JVM创建Font的时候会使用FontManagerFactory获取FontManager,而不同的系统使用的FontManager是不同的!Mac用的是CFontManager,而Linux用的是X11FontManager!

那么这两个FontManager的不同会导致什么不同呢?

CFontManager会创建CFont作为Font2D,这个CFont是JVM专门为mac创建的类,看类和方法的注释可以知道在mac环境下有时候物理字体会被CFont包装,而这是在native代码中完成的:
java linux文件出现中文乱码怎么办

X11FontManager创建的Font2D是包含了逻辑字体和物理字体的集合。X11FontManager继承了FcFontManager,FcFontManager继承了SunFontManager;我们看一下X11FontManager的loadFonts()方法,直接使用了SunFontManager的loadFonts(),SunFontManager的loadFonts()方法加载了物理字体,SunFontManager实现了FontManager的preferLocaleFonts()方法,加载了逻辑字体:
java linux文件出现中文乱码怎么办

java linux文件出现中文乱码怎么办

java linux文件出现中文乱码怎么办

逻辑字体与物理字体

代码debug到这边基本已经确认了是不同环境的字体加载问题,那么在debug linux环境的时候发现的逻辑字体和物理字体是什么东西呢?

物理字体

物理字体是实际的字体库,包含字形数据和表,这些数据和表使用字体技术(如 TrueType 或 PostScript Type 1)将字符序列映射到字形序列。Java PlatfORM 的所有实现都支持 TrueType 字体;对其他字体技术的支持是与实现相关的。物理字体可以使用字体名称,如 Helvetica、Palatino、HonMincho 或任意数量的其他字体名称。通常,每种物理字体只支持有限的书写系统集合,例如,只支持拉丁文字符,或者只支持日文和基本拉丁文。可用的物理字体集合随配置的不同而有所不同。要求特定字体的应用程序可以使用 createFont 方法来捆绑这些字体,并对其进行实例化。

逻辑字体

逻辑字体是由必须受所有 Java 运行时环境支持的 Java 平台所定义的五种字体系列:Serif、SansSerif、Monospaced、Dialog 和 DialogInput。这些逻辑字体不是实际的字体库。此外,由 Java 运行时环境将逻辑字体名称映射到物理字体。映射关系与实现和通常语言环境相关,因此它们提供的外观和规格各不相同。通常,为了覆盖庞大的字符范围,每种逻辑字体名称都映射到几种物理字体。

问题解决

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.## Versionversion=1# Component Font Mappingsserif.plain.chinese=-misc-simsun-medium-r-normal--*-%d-*-*-c-*-iso10646-1serif.plain.latin-1=-b&h-lucidabright-medium-r-normal--*-%d-*-*-p-*-iso8859-1# Search Sequencessequence.allfonts=latin-1,chinese# Exclusion Ranges# Font File Namesfilename.-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权限

感谢各位的阅读!关于“java linux文件出现中文乱码怎么办”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

--结束END--

本文标题: java linux文件出现中文乱码怎么办

本文链接: https://www.lsjlt.com/news/301875.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • java linux文件出现中文乱码怎么办
    这篇文章给大家分享的是有关java linux文件出现中文乱码怎么办的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。java linux文件中文乱码的解决办法:1、下载jdk1.8的sun源码;2、将Font的创建...
    99+
    2023-06-22
  • Linux下中文文件名乱码怎么办
    本篇内容介绍了“Linux下中文文件名乱码怎么办”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1)先下载并安装两个语言包:fonts-chi...
    99+
    2023-06-27
  • linux服务器java输出文件中文乱码
    使用下面语句查看编码:String encoding = System.getProperty("file.encoding");结果输出:ANSI_X3.4-1968,从而导致中文乱码。解决方法:通过 locale 查看服务器系统编码,需...
    99+
    2019-04-29
    java教程 linux java 输出文件 中文乱码
  • Windows系统文件出现乱码该怎么办?
    百度知道知友提出问题:为什么我的计算机系统文件显示乱码?我计算机的Win7系统是英文版的,但下载、安装了中文语言包后,下载到电脑里的中文软件还是显示乱码。如何解决Windows系统文件乱码的问题呢?(本文在Windows...
    99+
    2023-06-12
    Windows系统乱码 Windows文件乱码 Windows 系统文件 乱码
  • java中读取文本文件出现乱码
    最近遇到一个问题,Java读取文本文件(例如csv文件、txt文件等),遇到中文就变成乱码。读取代码如下:List lines=new ArrayList(); BufferedReader br = new BufferedReade...
    99+
    2017-06-04
    java 读取 文本文件 乱码
  • linux python中文乱码怎么办
    这篇文章将为大家详细讲解有关linux python中文乱码怎么办,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。linux python中文乱码的解决方法:1、查看matplotlib字体位置;2、上传字...
    99+
    2023-06-22
  • phpmyadmin导出中文乱码怎么办
    这篇文章主要介绍phpmyadmin导出中文乱码怎么办,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!使用PHPmyadmin把mysql数据库导入导出时,出现中文乱码的问题。以下介绍...
    99+
    2022-10-18
  • node.js 输出中文乱码怎么办
    本教程操作环境:Windows7系统、node18.4.0版、Dell G3电脑。node.js 输出中文乱码怎么办?Node.js中使用中文产生乱码的解决方案项目场景:Node.js 概述: 一个基于 Chrome JavaScript ...
    99+
    2022-11-22
    乱码 Node.js
  • java文件写入乱码怎么办
    在用Java程序进行读写含中文的txt文件时,经常会出现读出或写入的内容会出现乱码。是因为系统的编码和程序的编码采用了不同的编码格式。解决方法:采用java.io.FileInputStream/java.io.InputStreamRea...
    99+
    2018-07-03
    java 乱码
  • linux下openoffice word文件转PDF中文乱码怎么办
    这篇文章给大家分享的是有关linux下openoffice word文件转PDF中文乱码怎么办的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。网上很多介绍是由于jdk中的没有字体导致乱码,而我遇到的是转换过程并未报...
    99+
    2023-06-09
  • linux中php.ini中文乱码怎么办
    这篇文章主要介绍linux中php.ini中文乱码怎么办,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!什么是Linux系统Linux是一种免费使用和自由传播的类UNIX操作系统,是一个基于POSIX的多用户、多任务、...
    99+
    2023-06-15
  • java url中文乱码怎么办
    url中文乱码 java1.将字符串转码:newString(“xxxxx”.getBytes(“iso-8859-1”),”utf-8”)这种转码方式有很大的弊端,因为它是使用指定的字符集将此String编码为 byte 序列,并将结果存...
    99+
    2021-11-14
    java基础 url 中文乱码 java
  • MySQL会出现中文乱码问题怎么办
    小编给大家分享一下MySQL会出现中文乱码问题怎么办,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!1、MySQL会出现中文乱码的原因当我们在使用MySQL数据库的时候,经常会碰到乱码的问题,看...
    99+
    2022-10-18
  • springmvc 发送ajax出现中文乱码怎么办
    这篇文章将为大家详细讲解有关springmvc 发送ajax出现中文乱码怎么办,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。我使用的是sping-web-3.2.2,ja...
    99+
    2022-10-19
  • java 写入文件出现乱码怎么解决
    文件写入的时候有中文就很容易出现乱码,通常获取到的文件中通常都是“iso8859-1”格式,需要转换为“UTF-8”格式。如:String str = new String(str.getByte("iso8859-1"),"UTF-8")...
    99+
    2019-04-29
    java教程 java 写入文件 乱码
  • php导出csv中文乱码怎么办
    本文操作环境:windows7系统、PHP7.1版、DELL G3电脑php导出csv中文乱码怎么办?PHP导出CSV中文乱码的解决方法:UTF-8转GB2312一、背景因项目需求,要导出Excel表格数据,使用fputcsv方法导出数据遇...
    99+
    2020-06-27
    php csv
  • win7窗口出现文字乱码怎么办
    win7窗口出现文字乱码怎么办?我们经常会使用电脑。但是近期有小伙伴在使用win7系统的时候,发现文字是乱码的,这种情况我们应该如何解决呢。这种情况一般都是语言系统或者默认字体出了问题,如果你不会操作,小编下面整理了win7窗口出现文字乱码...
    99+
    2023-07-10
  • eclipse打开java文件出现乱码
    问题:eclipse打开java文件出现乱码解决方法:首先确认下java文件的编码是什么格式,选择乱码的java文件右键选择properties,进入该文件的设置页面,选择resources属性,在页面下方可以看到Text file enc...
    99+
    2020-02-27
    java基础 eclipse java 文件 乱码
  • java导出文件出现文件名乱码解决方法
    出现的问题:在chrome浏览器中导出的excel文件名没有出现中文乱码的情况,在测试IE浏览器的时候,导出的文件名乱码了。解决方法:原来的代码:try { response.setContentType("appl...
    99+
    2015-07-21
    java 乱码
  • SecureCRT出现中文乱码怎么办?win10系统使用SecureCRT出现中文乱码的解决方法
    很多用户在Windows10系统电脑中使用SecureCRT时,都会遇到中文乱码的情况,这是怎么回事呢?我们要如何操作呢?接下来,小编就为大家详细介绍win10下使用SecureCRT出现中文乱码的解决方法吧! 具体如下...
    99+
    2023-05-22
    win10系统中文乱码 securecrt 中文乱码
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作