Java Linux 파일의 중국어 왜곡 문자에 대한 솔루션: 1. jdk1.8의 sun 소스 코드를 다운로드합니다. 2. 글꼴 생성을 물리적 글꼴에서 논리 글꼴로 변경합니다. 3. 서비스를 다시 시작합니다.
이 기사의 운영 환경: linux5.9.8 시스템, jdk1.8, Dell G3 컴퓨터.
Java Linux 파일의 중국어 문자 깨짐 문제를 해결하는 방법?
Linux 환경의 Java 중국어 문자 깨짐 해결 방법
최근에 많은 친구들이 Java 문자 깨짐 문제에 직면한 적이 있습니다. 또한 "텍스트를 사용하여 그림을 생성하는 과정" "중국어 및 특수 문자가 깨짐" 문제를 해결했습니다. 나는 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를 열 때 다음 장면을 보는 것입니다.
로컬 디버깅에 문제가 없어 테스트머신(Linux)에 올려놓고 실행해 보니 실행 결과가 놀라웠습니다.
jdk1.8 sun 소스코드 다운로드
따라가세요. 일관된 프로그래머 스타일 : 문제가 있으면 Debug!
비결은 현재 소스 코드 패키지에 더 이상 sun 패키지의 코드가 포함되어 있지 않다는 것입니다!
다행히 Java는 OpenJDK의 코드가 기본적으로 JVM 소스 코드와 동일하다는 것을 공식적으로 확인했습니다. OpenJDK8u: jdk8u에서 직접 다운로드할 수 있습니다.
소스 코드를 사용하여 디버깅하는 방법에 대해서는 쓰지 않겠습니다. ... 이건 기본이 아니니 이 글은 읽지 마세요.
문제 찾기
소스 코드를 직접 다운로드하고, 원격 중단점을 사용하여 서버에서 실행해 보세요. 디버깅 중에 문제를 일으킨 첫 번째 코드를 발견했습니다. 로컬 서버와 테스트 서버 간의 불일치:
JVM이 글꼴을 생성할 때 FontManagerFactory를 사용하여 글꼴 관리자를 얻고, 서로 다른 시스템이 서로 다른 FontManager를 사용하는 것으로 나타났습니다. Mac은 CFontManager를 사용하고 Linux는 X11FontManager를 사용합니다!
이 두 FontManager의 차이점은 무엇인가요?
CFontManager는 CFont를 Font2D로 생성합니다. 이 CFont는 Mac용으로 특별히 JVM에서 만든 클래스입니다. 클래스 및 메서드에 대한 설명을 보면 Mac 환경에서 물리적 글꼴이 CFont로 래핑되는 경우가 있다는 것을 알 수 있습니다. :
X11FontManager로 생성된Font2D는 논리적 글꼴과 물리적 글꼴을 포함하는 컬렉션입니다. X11FontManager는 FcFontManager를 상속하고, FcFontManager는 SunFontManager의 loadFonts() 메서드를 직접 사용하여 FontManager의 chooseLocaleFonts() 메서드를 구현하는 방법을 살펴보겠습니다. 로드됨:
논리적 글꼴과 물리적 글꼴
여기서의 코드 디버깅을 통해 기본적으로 다른 환경에서의 글꼴 로딩 문제임을 확인했으니 리눅스 환경 디버깅 시 발견되는 논리적 글꼴 그리고 물리적 글꼴이란 무엇일까요?
물리적 글꼴
물리적 글꼴은 TrueType 또는 PostScript Type 1과 같은 글꼴 기술을 사용하여 문자 시퀀스를 글리프 시퀀스에 매핑하는 글리프 데이터와 테이블을 포함하는 실제 글꼴 라이브러리입니다. Java 플랫폼의 모든 구현은 트루타입 글꼴을 지원합니다. 다른 글꼴 기술에 대한 지원은 구현에 따라 다릅니다. 실제 글꼴은 Helvetica, Palatino, HonMincho 등의 글꼴 이름이나 기타 다양한 글꼴 이름을 사용할 수 있습니다. 일반적으로 각 실제 글꼴은 제한된 쓰기 시스템 세트(예: 라틴 문자만 또는 일본어 및 기본 라틴어만 지원)만 지원합니다. 사용 가능한 물리적 글꼴 세트는 구성에 따라 다릅니다. 특정 글꼴이 필요한 애플리케이션은 createFont 메서드를 사용하여 이러한 글꼴을 묶고 인스턴스화할 수 있습니다.
논리 글꼴
논리 글꼴은 모든 Java 런타임 환경(Serif, SansSerif, Monospaced, Dialog 및 DialogInput)에서 지원해야 하는 Java 플랫폼에서 정의한 5가지 글꼴 계열입니다. 이러한 논리적 글꼴은 실제 글꼴 라이브러리가 아닙니다. 또한 논리적 글꼴 이름을 물리적 글꼴에 매핑하는 것은 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. # # 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视频教程》
위 내용은 Java Linux 파일의 중국어 문자 왜곡 문제를 해결하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

Linux 복구 모드를 입력하는 단계는 다음과 같습니다. 1. 시스템을 다시 시작하고 특정 키를 눌러 Grub 메뉴를 입력하십시오. 2. (복구 계)로 옵션을 선택하십시오. 3. FSCK 또는 루트와 같은 복구 모드 메뉴에서 작업을 선택하십시오. 복구 모드를 사용하면 단일 사용자 모드에서 시스템을 시작하고 파일 시스템 검사 및 수리를 수행하고 구성 파일 편집 및 기타 작업을 수행하여 시스템 문제를 해결할 수 있습니다.

Linux의 핵심 구성 요소에는 커널, 파일 시스템, 쉘 및 공통 도구가 포함됩니다. 1. 커널은 하드웨어 리소스를 관리하고 기본 서비스를 제공합니다. 2. 파일 시스템은 데이터를 구성하고 저장합니다. 3. Shell은 사용자가 시스템과 상호 작용할 수있는 인터페이스입니다. 4. 일반적인 도구는 일상적인 작업을 완료하는 데 도움이됩니다.

Linux의 기본 구조에는 커널, 파일 시스템 및 쉘이 포함됩니다. 1) 커널 관리 하드웨어 리소스 및 UNAME-R을 사용하여 버전을보십시오. 2) Ext4 파일 시스템은 큰 파일과 로그를 지원하며 mkfs.ext4를 사용하여 생성됩니다. 3) Shell은 Bash와 같은 명령 줄 상호 작용을 제공하고 LS-L을 사용하는 파일을 나열합니다.

Linux 시스템 관리 및 유지 보수의 주요 단계에는 다음이 포함됩니다. 1) 파일 시스템 구조 및 사용자 관리와 같은 기본 지식을 마스터합니다. 2) 시스템 모니터링 및 리소스 관리를 수행하고 Top, HTOP 및 기타 도구를 사용하십시오. 3) 시스템 로그를 사용하여 문제를 해결하고 JournalCTL 및 기타 도구를 사용하십시오. 4) 자동 스크립트 및 작업 스케줄링을 작성하고 CRON 도구를 사용하십시오. 5) 보안 관리 및 보호 구현, iptables를 통해 방화벽을 구성합니다. 6) 성능 최적화 및 모범 사례를 수행하고 커널 매개 변수를 조정하며 좋은 습관을 개발하십시오.

시작시 init =/bin/bash 또는 단일 매개 변수를 추가하여 Linux 유지 관리 모드가 입력됩니다. 1. 유지 보수 모드를 입력하십시오 : 그루브 메뉴를 편집하고 시작 매개 변수를 추가하십시오. 2. 파일 시스템을 다시 마운트하여 읽고 쓰기 모드 : MOUNT-OREMOUNT, RW/. 3. 파일 시스템 수리 : FSCK/DEV/SDA1과 같은 FSCK 명령을 사용하십시오. 4. 데이터 손실을 피하기 위해 데이터를 백업하고주의해서 작동합니다.

이 기사에서는 데비안 시스템에서 Hadoop 데이터 처리 효율성을 향상시키는 방법에 대해 설명합니다. 최적화 전략에는 하드웨어 업그레이드, 운영 체제 매개 변수 조정, Hadoop 구성 수정 및 효율적인 알고리즘 및 도구 사용이 포함됩니다. 1. 하드웨어 리소스 강화는 모든 노드에 일관된 하드웨어 구성, 특히 CPU, 메모리 및 네트워크 장비 성능에주의를 기울일 수 있도록합니다. 전반적인 처리 속도를 향상시키기 위해서는 고성능 하드웨어 구성 요소를 선택하는 것이 필수적입니다. 2. 운영 체제 조정 파일 설명 자 및 네트워크 연결 : /etc/security/limits.conf 파일을 수정하여 파일 설명자의 상한을 늘리고 동시에 시스템에 의해 열 수 있습니다. JVM 매개 변수 조정 : Hadoop-env.sh 파일에서 조정

이 안내서는 데비안 시스템에서 syslog를 사용하는 방법을 배우도록 안내합니다. Syslog는 로깅 시스템 및 응용 프로그램 로그 메시지를위한 Linux 시스템의 핵심 서비스입니다. 관리자가 시스템 활동을 모니터링하고 분석하여 문제를 신속하게 식별하고 해결하는 데 도움이됩니다. 1. syslog에 대한 기본 지식 syslog의 핵심 기능에는 다음이 포함됩니다. 로그 메시지 중앙 수집 및 관리; 다중 로그 출력 형식 및 대상 위치 (예 : 파일 또는 네트워크) 지원; 실시간 로그보기 및 필터링 기능 제공. 2. Syslog 설치 및 구성 (RSYSLOG 사용) Debian 시스템은 기본적으로 RSYSLOG를 사용합니다. 다음 명령으로 설치할 수 있습니다 : sudoaptupdatesud

데비안 시스템에 적합한 Hadoop 버전을 선택할 때는 다음과 같은 주요 요소를 고려해야합니다. 1. 안정성 및 장기 지원 : 안정성과 보안을 추구하는 사용자의 경우 Debian11 (Bullseye)과 같은 데비안 안정 버전을 선택하는 것이 좋습니다. 이 버전은 완전히 테스트되었으며 최대 5 년의 지원주기가있어 시스템의 안정적인 작동을 보장 할 수 있습니다. 2. 패키지 업데이트 속도 : 최신 Hadoop 기능 및 기능을 사용해야하는 경우 Debian의 불안정한 버전 (SID)을 고려할 수 있습니다. 그러나 불안정한 버전에는 호환성 문제와 안정성 위험이있을 수 있습니다. 3. 커뮤니티 지원 및 자원 : 데비안은 풍부한 문서를 제공하고


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

드림위버 CS6
시각적 웹 개발 도구

Atom Editor Mac 버전 다운로드
가장 인기 있는 오픈 소스 편집기

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

DVWA
DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는
