1. 程式人生 > >記一個bug:Linux中Java Graphics drawString寫中文亂碼

記一個bug:Linux中Java Graphics drawString寫中文亂碼

近期用到了動態生成二維碼的功能,並且在二維碼底下加文字,win下開發沒有出現問題,但是部署到Linux環境下出現中文亂碼。經排查之後發現程式碼中Font類(new Font("微軟雅黑", Font.PLAIN, 35))用到了"微軟雅黑"中文字型,但Centos預設沒有這種字型,所以出現亂碼。安裝好字型後,重新啟動Tomcat之後出現了:

java.lang.UnsatisfiedLinkError: sun.font.FreetypeFontScaler.initIDs(Ljava/lang/Class;)V

報錯,然後多方論證確認是jdk的版本問題,我係統用的1.8.0_111,升級到1.8.0_191以後問題得以解決。此處貼出Linux安裝字型步驟。

1. 在 /usr/share/fonts 目錄底下建立資料夾 chinese(資料夾名稱可自取)

2. 複製需要新增的字型檔案 "*.ttf"或"*.ttc" 到  /usr/share/fonts/chinese

3. 移動到/usr/share/fonts/chinese目錄底下,使用以下命令建立索引(生成fonts.scale和fonts.dir)

                   /usr/share/fonts/chinese # mkfontdir  

                  /usr/share/fonts/chinese # mkfontscale 

4. 重新整理字型:fc-cache

5. 檢視字型:fc-list

注:第3步如果提示 mkfontscale/mkfontdir: command not found,需自行安裝 # yum install mkfontscale/mkfontdir。如果fc-list沒有看到新增的字型,有可能是此字型受版權保護無法新增進去,建議換成免費字型。步驟執行完之後重啟Tomcat服務就生效了。

bug詳情:

Caused by: java.lang.reflect.InvocationTargetException
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at com.jfinal.aop.Invocation.invoke(Invocation.java:73)
	... 37 more
Caused by: java.lang.UnsatisfiedLinkError: sun.font.FreetypeFontScaler.initIDs(Ljava/lang/Class;)V
	at sun.font.FreetypeFontScaler.initIDs(Native Method)
	at sun.font.FreetypeFontScaler.<clinit>(FreetypeFontScaler.java:50)
	at java.lang.Class.forName0(Native Method)
	at java.lang.Class.forName(Class.java:264)
	at sun.font.FontScaler.<clinit>(FontScaler.java:98)
	at sun.font.TrueTypeFont.getScaler(TrueTypeFont.java:1298)
	at sun.font.FileFontStrike.<init>(FileFontStrike.java:179)
	at sun.font.FileFont.createStrike(FileFont.java:95)
	at sun.font.Font2D.getStrike(Font2D.java:359)
	at sun.font.Font2D.getStrike(Font2D.java:281)
	at sun.java2d.SunGraphics2D.checkFontInfo(SunGraphics2D.java:774)
	at sun.java2d.SunGraphics2D.getFontInfo(SunGraphics2D.java:830)
	at sun.java2d.pipe.GlyphListPipe.drawString(GlyphListPipe.java:50)
	at sun.java2d.SunGraphics2D.drawString(SunGraphics2D.java:2928)
	at cn.edu.group.ks.util.ImageUtil.addDetailOnPic(ImageUtil.java:61)
	at cn.edu.group.ks.service.impl.JsQrCodeServiceImpl.getJsQrCodeImge(JsQrCodeServiceImpl.java:113)
	at cn.edu.group.ks.service.impl.JsQrCodeServiceImpl.getJsQrCode(JsQrCodeServiceImpl.java:37)
	at cn.edu.group.ks.controller.js.ClassroomController.getQrCode(ClassroomController.java:168)
	at cn.edu.group.ks.controller.js.ClassroomController.batchQr(ClassroomController.java:183)
	... 42 more

重要的兩步:

1.新增字型庫;

2.如果未解決升級下jdk版本。

參考文章:https://www.jianshu.com/p/354d5ab51215

相關推薦

一個bugLinuxJava Graphics drawString中文亂碼

近期用到了動態生成二維碼的功能,並且在二維碼底下加文字,win下開發沒有出現問題,但是部署到Linux環境下出現中文亂碼。經排查之後發現程式碼中Font類(new Font("微軟雅黑", Font.PLAIN, 35))用到了"微軟雅黑"中文字型,但Centos預設沒有這種

Spring Boot遇到問題二IDEA讀取application.properties會中文亂碼

問題描述 在application.properties中配置有中文內容時,讀取出來的內容中文是亂碼的,如我的application.properties配置內容如下: com.xxx.qa.blog.name=測試極客 com.xxx.qa.blog.

linuxjava解析html出現中文亂碼問題

一,用java解析html文件遇到的問題 在windows環境下用BufferedReader讀取utf-8的html檔案時,沒有任何亂碼問題,但是在linux環境下讀取的時候就出現亂碼了,不知道什麼問題引起的。 後來用FileInputStream讀取,用new Str

一個bugcalloc出現的segment fault

其實也就雞毛蒜皮的小事,本來不想記錄在部落格上的,不過這個bug背後隱藏的東西確實比較有記錄的價值,如果說解bug就像是解初高中數學題,那麼有的bug就像一道出得很漂亮的題,短小精幹但背後隱藏的資訊量卻很大,一下子就讓你記住了背後的那些定理概念。 事情是這樣的,segment

記錄定時任務的一個錯誤crontab 使用"%"的問題

unless roo 記錄 翻譯 int 使用 tab 單獨 結束 最近工作需要,需要定時執行命令文件,並且把執行的日誌重定向輸出到以日期命名的文件中,命令如下: /bin/bash /data/shell/merge.sh &>> /data/shel

Linux故障linux使用ifconfig命令查看網卡信息時顯示為eth1,但是在network-scripts只有ifcfg-eth0的配置文件,並且裏面的NAME="eth0"。

udev 系統 persist restart bsp rule init clear 命令 除了題目中的問題,其實在執行命令:service network restart時,會報錯: 解決辦法: 首先需要修改70-persistent-net.rules文件

一個bug的排查過程---復盤

菜單項 註意 解決 做了 微信公眾號 排查過程 文本 結果 sql錯誤 公眾號做了新需求:菜單的click事件,支持多條客服消息。 上線後,只有一個功能不好使,是點擊菜單,預期發一條文本類型的客服消息。 實際操作時,點這個菜單項後,什麽也沒有發生。elk上看日誌,也沒有

打補丁linux 的Diff和patch

diff和patch是一對工具,從數學上來講,diff是對兩個集合的差運算,patch是兩個集合的和運算。基本命令語法:patch [-R] {-p(n)} [--dry-run] < patch_file_name p:為path的縮寫。 n:指將patch

Linuxjava log輸出中文亂碼

比如這樣一段程式碼: logger.debug("中文亂碼?Chinese");輸出結果是這樣的: 2016-06-12 10:24:46,130:DEBUG main (CleanupTaskTest.java:27) - ?????Chinese 執行lo

宋寶華 Linux的1024——給閱碼場Linuxer們的節日祝福

1024是程式設計師的狂歡節。基於二進位制的原理,程式設計師通常會把1024當做一個整數而不是1000。程式設計師這個行業處理“bit”,當然這個行業“苦逼”,這也讓我輕鬆地記住了一個單詞——bitter。bitter的意思就是“苦的”,bit後面加er字尾,是人,這裡只是會

Linux命令學習Linuxmore和less命令以及查詢用法

** 一、more命令 ** more功能類似 cat ,cat命令是整個檔案的內容從上到下顯示在螢幕上。 more會以一頁一頁的顯示方便使用者逐頁閱讀,而最基本的指令就是按空白鍵(space)就往下一頁顯示,按 b 鍵就會往回(back)一頁顯示,而且還有搜尋字串的功能 。mo

第五章Linux的磁碟

Linux磁碟管理好壞直接關係到整個系統的效能問題。Linux磁碟管理常用三個命令為df、du和fdisk。df:列出檔案系統的整體磁碟使用量 du:檢查磁碟空間使用量 fdisk:用於磁碟分割槽 磁碟介紹 磁碟分割槽:將硬碟劃分成多個邏輯儲存單元(分割槽) 分割槽好

筆記linux實現fiq模式(關於arm中斷,喚醒中斷)

3、喚醒中斷控制器(WIC) WIC可以使處理器和NVIC處於一個低功耗睡眠的模式。 處理器完全使用WFI、WFE和SEV指令集。另外,處理器也支援Sleep-on-exit,這會導致處理器核心在從一個異常處理返回到執行緒模式時進入睡眠模式。

小何講Linux Linux檔案及檔案描述符概述

在Linux中,一切皆檔案!所有對裝置和檔案的操作都是使用檔案描述符來進行的。檔案描述符是一個非負的整數,它是一個索引值,並指向在核心中每個程序所開啟的檔案的記錄表;當開啟一個現存檔案或建立一個新檔案

shell指令碼一次性配置Linuxjava環境變數

只需bash一下,很輕鬆有木有QAQ詳見程式碼:#!bin/bash nowLoad=`pwd` goalPath="/usr/java" #我們把jdk放在這兒 environmentPath="/home/kzl/.bash_profile" #kzl是我的使用者名

(轉載) socket10038錯誤{winSock的一個bug當closesocket多次錯誤使用時會導致問題}

這幾天想在一個開源的程式碼上進行修改,以期研發出一個產品出來。       程式原來是單執行緒網路程式,需要修改為多執行緒,修改之後,總是出問題,輔助執行緒中的recv函式總是執行一陣子之後收到長度為-1的資料報,導致程式執行不正確甚至崩潰。        由於是多執行緒,只

Linux系列Linux如何安裝.rpm、.tar、.tar.gz和tar.bz2檔案

我以下面三個包為例:(三個包都在/etc/opt下) A. example-1.2.3-1.rpm B. example-1.2.3-1.tar C. example-1.2.3-1.tar.gz1. 安裝rpm包 說起RPM(REDHAT Package Management)標準的軟體包,大家可能都會想起

文件總結linux裝置的訪問

1.裝置訪問 1.裝置識別 /dev/xdxn ##硬碟裝置/dev/sda1 /dev/cdrom ##光碟機 /dev/mapper/* ##虛擬裝置 2.裝置的使用 裝置的發現 fdisk -l

小何講程序Linux的exec函式族講解

1.  exec函式族-exec()函式族說明使用exec函式族主要有兩種情況當程序認為自己不能再為系統和使用者做出任何貢獻時,就可以呼叫exec函式族中的任意一個函式讓自己重生;如果一個程序想執行另一個程式,那麼它就可以呼叫fork()/vfork()函式新建一個程序,然

.net的一個BugInt64與Byte[8]互轉的問題

有一個64位整數值:    Int64 n = 634636512000000000; 有兩種方法可以轉為位元組流 1:    byte[] buffer = new byte[8];    buffer[0] = (byte)n;    buffer[1] = (byt