jodconvert轉換中文文檔時中文亂碼的小坑

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 原創者:文思

繼上一篇代碼編寫和部署后,這次測試發現轉換后的pdf的中文都是亂碼,作為程序員的我第一時間就去想到了gbk與utf-8之間的字符集編碼轉換問題。首先在本地windows環境測試,生成的pdf不是亂碼,后來把docx都改成了odt,然后又嘗試用流的形式加上utf-8參數中轉一下,也不行。百度上有說是linux沒有中文字符集,那就試試看了。

要查看系統中已經安裝的字體,我們可以使用fc-list命令進行查看。如果系統中沒有該命令的話,我們需要先安裝相關的軟件包。

yum install -y fontconfig mkfontscale

fc-list :lang=zh

注意:fc-list與:之間有空格

可以看到默認情況下是沒有安裝中文字體的。

我們現在需要把楷體文件上傳到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了,問題圓滿解決。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容