? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 原創者:文思
繼上一篇代碼編寫和部署后,這次測試發現轉換后的pdf的中文都是亂碼,作為程序員的我第一時間就去想到了gbk與utf-8之間的字符集編碼轉換問題。首先在本地windows環境測試,生成的pdf不是亂碼,后來把docx都改成了odt,然后又嘗試用流的形式加上utf-8參數中轉一下,也不行。百度上有說是linux沒有中文字符集,那就試試看了。
要查看系統中已經安裝的字體,我們可以使用fc-list命令進行查看。如果系統中沒有該命令的話,我們需要先安裝相關的軟件包。
yum install -y fontconfig mkfontscale
fc-list :lang=zh
可以看到默認情況下是沒有安裝中文字體的。
我們現在需要把楷體文件上傳到linux服務器上。在windows下找到
復制到linux系統的/usr/share/fonts/目錄下
再次命令查看:
運行doc轉pdf:
已中文亂碼問題已經解決,可顯示。添加一種字體即可,其它沒有的字體都會轉成成此字體,如果也想展示其它字體的效果,依次添加其它字體。
續:
測試環境ok了,在生產環境上也出現中文亂碼了,將生產環境也以上述安裝了一個字體后還是亂碼,就用env和locale命令查看字符集:
生產環境上env:
LANG=en_US.UTF-8
沒有亂碼問題的測試環境上env:
LANG=zh_CN.UTF-8
運行local查看字符集:
生產環境上locale:
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
沒有亂碼問題的測試環境上locale:
LANG=zh_CN.UTF-8
LC_CTYPE="zh_CN.UTF-8"
LC_NUMERIC="zh_CN.UTF-8"
LC_TIME="zh_CN.UTF-8"
LC_COLLATE="zh_CN.UTF-8"
LC_MONETARY="zh_CN.UTF-8"
LC_MESSAGES="zh_CN.UTF-8"
LC_PAPER="zh_CN.UTF-8"
LC_NAME="zh_CN.UTF-8"
LC_ADDRESS="zh_CN.UTF-8"
LC_TELEPHONE="zh_CN.UTF-8"
LC_MEASUREMENT="zh_CN.UTF-8"
LC_IDENTIFICATION="zh_CN.UTF-8"
LC_ALL=
字符集不一樣,新打開了一個shell命令窗口設置生產環境字符集為zh_CN.UTF-8,然后在原來的shell命令窗口重啟服務,注意,剛才操作是新打開了一個命令窗口進行字符集設置的,重啟服務是在原來老的命令窗口重啟的。重啟后竟然沒有生效還是亂碼,到這一步真快瘋了,后來在原有的shell命令窗口再次查看字符集發現字符集沒變,就猜想原來的shell命令窗口只對當前的環境有效,對其它新窗口設置的環境沒有加載和生效,原理有些類似在window的命令行界面下的環境變量set設置原理,只對當前窗口有效。于是重新打開一個新的shell命令窗口,重啟服務,一下ok了,問題圓滿解決。