過curl往微信api接口推送微信客服消息時,如果出現亂碼的情況,是因為通過json_encode方法將數組轉換為json時,json_encode方法將字符串轉換為了Unicode編碼。
避免出現亂碼最簡單的方式是在json_encode方法里加入JSON_UNESCAPED_UNICODE參數,讓json_encode方法不將中文轉換為unicode編碼,但是,json_encode函數只有在php5.4以后的版本才支持這個參數,在某些生成環境,用的是老版本的php,沒辦法直接加JSON_UNESCAPED_UNICODE參數,只能用別的方法解決。
用的方法是先將字符串進行urlencode,然后再執行json_encode,在得到json字符串后,再urldecode一下得到最終沒有亂碼的字符串。
通常我們推送微信消息的時候,都是將數組轉換為json,如果是一維數組,我們在用urlencode時,可以直接通過下面的代碼實現:
<?php
$dataAry=["title"=> "中文標題", "desc"=> "中文描述","content"=>"中文正文"];
$encodeAry=array_map('urlencode', $dataAry);
$jsonStr=json_encode($encodeAry);
var_dump($jsonStr);
$decodeStr=urldecode($jsonStr);
var_dump($decodeStr);
?>
但是,我們通常數組結構是多維的,也就是數組里包含有數組,這時,使用array_map('urlencode',$dataAry)方法就會出錯,會提示:Warning: urlencode() expects parameter 1 to be string, array given。
這時,如果是多級數組進行urlencode時,只能自己寫一個方法遞歸進行處理了,方法內容如下:
就在昨天,坐我對面的平臺組同事跟前端同事正在疑惑的討論聯調過程中遇到的問題,大概的情形是這樣的,后端同事需要將一個報表數據生成圖片,然后傳給前端展示,聽起來感覺是一個不太麻煩也挺簡單的需求,但是他們已經討論了2天,還是沒有解決,他們一直認為可能是前后端傳輸圖片數據編碼問題,嘗試了將數據編碼,前端解碼,以及其它一些方式,還是存在問題,他們一直想不通,為何本地聯調顯示沒問題,放到服務器上出現中文亂碼問題呢?
當我了解以后,我笑著說,這個問題在我漫長的碼農生涯中也遇到過,哈哈,讓我們好好一起來看看這個問題。
import matplotlib.pyplot as plt
fig=plt.figure(figsize=(5, 5)) # 定義圖并設置畫板尺寸
fig.set(alpha=0.2)
ax1=fig.add_subplot(111)
plt.title('測試圖')
plt.xlabel('x標簽')
plt.ylabel('y標簽')
plt.savefig('test.png')
紅色部分的中文被正方形替代,這是matplotlib 自帶的字體庫不支持中文所致,這里加入下面兩行代碼調用系統中文字體simhei.ttf文件,當然你也可以使用你想要的中文字體,只要放在正確的位置即可,還有一個辦法不用添加代碼,需要把下載中文字體>放入 matplotlib 字體庫路徑>修改 matplotlibrc 文件,也能達到效果,下面使用的是第一種方案
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"]=["SimHei"] # 設置字體
plt.rcParams["axes.unicode_minus"]=False # 該語句解決圖像中的“-”負號的亂碼問題
fig=plt.figure(figsize=(5, 5)) # 定義圖并設置畫板尺寸
fig.set(alpha=0.2)
ax1=fig.add_subplot(111)
plt.title('測試圖')
plt.xlabel('x標簽')
plt.ylabel('y標簽')
plt.savefig('test.png')
中文顯示正常。
使用上面在windows系統中文顯示沒問題的代碼,結果如下
中文還是方塊,并且代碼還有一個警告
通過警告可以知道,centos系統沒有該中文字體。
解決辦法
1,在windows的C:\Windows\Fonts目錄下找到"SimHei"這個字體文件,顯示的名字是“黑體 常規”的名字。
2,將上面的C:\Windows\Fonts\simhei.ttf文件,然后復制到centos服務器的/usr/share/fonts/目錄下。
3,清除matplotlib緩存,運行指令rm -rf ~/.cache/matplotlib。
4,再次運行代碼結果如下,完美解決
當然你也可以使用你自己想要的字體,沒有的字體也可以下載,只要放到上面的目錄即可使用。
再啰嗦一點,如果應用是部署在容器里,這里稍微說一下方案,需要在項目文件里包含字體文件,在容器鏡像文件里,使用命令將字體文件復制到容器/usr/share/fonts/目錄下,增加這兩條指令就行。
這次分享就到這了,我同事也順利解決了問題,希望也能夠幫助到大家,期待下次相遇,再見。