Python的中文亂碼是個(gè)很煩人的問(wèn)題,雖然網(wǎng)上也有非常多的解決方案,但是由于不同的項(xiàng)目,在細(xì)節(jié)上也有很多不同的地方,導(dǎo)致在實(shí)際工作中解決起來(lái)總是不盡如人意,本文也將提供2種解決方案,希望能給大家提供一些思路,幫助大家解決亂碼問(wèn)題。首先介紹一下我使用的環(huán)境:Windows 7 + Python 2.7.17 + PyCharm Community Edition 2016.1.5
方案一:使用decode函數(shù)
在這個(gè)實(shí)例中,開(kāi)頭的2行代碼,指定文件的編碼是UTF-8的,這一步是必須的。最后一行是先用str函數(shù)將list轉(zhuǎn)換為string,再使用decode函數(shù)進(jìn)行解碼。而參數(shù)string_escape的含義是指對(duì)二進(jìn)制的字節(jié)流,一個(gè)字節(jié)一個(gè)字節(jié)的轉(zhuǎn)義,與之相對(duì)應(yīng)的還是一個(gè)unicode-escape,他是兩個(gè)字節(jié)兩個(gè)字節(jié)的轉(zhuǎn)義。下面是程序執(zhí)行效果。
我們執(zhí)行一下上面的程序,從中可以看到控制臺(tái)的第3行和第4行,都正確的打印出了漢字結(jié)果,即"大家好"等等字樣。第5行表示,在沒(méi)有使用decode之前,list顯示的還是亂碼,但經(jīng)過(guò)decode之后,第6行就可以正確的打印出漢字來(lái)。
在上面的實(shí)例中,我們使用decode來(lái)達(dá)到我們的目的。但是每次都要增加一些函數(shù)調(diào)用和類型轉(zhuǎn)換,導(dǎo)致整個(gè)源代碼變得臃腫又難看。接下來(lái),我們?cè)偬峁┮粋€(gè)更簡(jiǎn)捷的方案。
方案二,使用uniout
還是先上源代碼。源代碼開(kāi)頭仍然是指定文件編碼是UTF-8,這一步是必須的。
接下來(lái),直接加入一行import uniout。然后我們就不再需要在源代碼再進(jìn)行任何特殊處理,直接print就可以在控制臺(tái)上打印出正確的漢字了。
如果你的環(huán)境里沒(méi)有uniout,并且機(jī)器是聯(lián)網(wǎng)的,那么可以直接用pip來(lái)安裝。
以上就是本篇文章關(guān)于中文亂碼的2種解決方案。希望能夠?qū)Υ蠹矣兴鶐椭?/p>
就在昨天,坐我對(duì)面的平臺(tái)組同事跟前端同事正在疑惑的討論聯(lián)調(diào)過(guò)程中遇到的問(wèn)題,大概的情形是這樣的,后端同事需要將一個(gè)報(bào)表數(shù)據(jù)生成圖片,然后傳給前端展示,聽(tīng)起來(lái)感覺(jué)是一個(gè)不太麻煩也挺簡(jiǎn)單的需求,但是他們已經(jīng)討論了2天,還是沒(méi)有解決,他們一直認(rèn)為可能是前后端傳輸圖片數(shù)據(jù)編碼問(wèn)題,嘗試了將數(shù)據(jù)編碼,前端解碼,以及其它一些方式,還是存在問(wèn)題,他們一直想不通,為何本地聯(lián)調(diào)顯示沒(méi)問(wèn)題,放到服務(wù)器上出現(xiàn)中文亂碼問(wèn)題呢?
當(dāng)我了解以后,我笑著說(shuō),這個(gè)問(wèn)題在我漫長(zhǎng)的碼農(nóng)生涯中也遇到過(guò),哈哈,讓我們好好一起來(lái)看看這個(gè)問(wèn)題。
import matplotlib.pyplot as plt
fig=plt.figure(figsize=(5, 5)) # 定義圖并設(shè)置畫板尺寸
fig.set(alpha=0.2)
ax1=fig.add_subplot(111)
plt.title('測(cè)試圖')
plt.xlabel('x標(biāo)簽')
plt.ylabel('y標(biāo)簽')
plt.savefig('test.png')
紅色部分的中文被正方形替代,這是matplotlib 自帶的字體庫(kù)不支持中文所致,這里加入下面兩行代碼調(diào)用系統(tǒng)中文字體simhei.ttf文件,當(dāng)然你也可以使用你想要的中文字體,只要放在正確的位置即可,還有一個(gè)辦法不用添加代碼,需要把下載中文字體>放入 matplotlib 字體庫(kù)路徑>修改 matplotlibrc 文件,也能達(dá)到效果,下面使用的是第一種方案
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"]=["SimHei"] # 設(shè)置字體
plt.rcParams["axes.unicode_minus"]=False # 該語(yǔ)句解決圖像中的“-”負(fù)號(hào)的亂碼問(wèn)題
fig=plt.figure(figsize=(5, 5)) # 定義圖并設(shè)置畫板尺寸
fig.set(alpha=0.2)
ax1=fig.add_subplot(111)
plt.title('測(cè)試圖')
plt.xlabel('x標(biāo)簽')
plt.ylabel('y標(biāo)簽')
plt.savefig('test.png')
中文顯示正常。
使用上面在windows系統(tǒng)中文顯示沒(méi)問(wèn)題的代碼,結(jié)果如下
中文還是方塊,并且代碼還有一個(gè)警告
通過(guò)警告可以知道,centos系統(tǒng)沒(méi)有該中文字體。
解決辦法
1,在windows的C:\Windows\Fonts目錄下找到"SimHei"這個(gè)字體文件,顯示的名字是“黑體 常規(guī)”的名字。
2,將上面的C:\Windows\Fonts\simhei.ttf文件,然后復(fù)制到centos服務(wù)器的/usr/share/fonts/目錄下。
3,清除matplotlib緩存,運(yùn)行指令rm -rf ~/.cache/matplotlib。
4,再次運(yùn)行代碼結(jié)果如下,完美解決
當(dāng)然你也可以使用你自己想要的字體,沒(méi)有的字體也可以下載,只要放到上面的目錄即可使用。
再啰嗦一點(diǎn),如果應(yīng)用是部署在容器里,這里稍微說(shuō)一下方案,需要在項(xiàng)目文件里包含字體文件,在容器鏡像文件里,使用命令將字體文件復(fù)制到容器/usr/share/fonts/目錄下,增加這兩條指令就行。
這次分享就到這了,我同事也順利解決了問(wèn)題,希望也能夠幫助到大家,期待下次相遇,再見(jiàn)。