有多個項目在跑,最開始的時候所有項目都是正常的,終于有一天,新建了一個新的項目,這個項目里通過httpclient發(fā)出去的中文都是亂碼的。于是開始了為期不知道多久的排查。
本地開發(fā)都是好的,打包發(fā)上服務器就不正常了--!
httpClient發(fā)送亂碼,應該跟發(fā)送前的編碼設置有關吧?
ContentType.APPLICATION_JSON這個類的配置采用的就是UTF-8,這樣子應該沒啥問題了吧。
StringEntity stringEntity = new StringEntity(body, ContentType.APPLICATION_JSON);
httpPost.setHeader("Accept", "application/json");
httpPost.setHeader("Content-type", "application/json; charset=UTF-8");
httpPost.setHeader("Accept-Encoding", "gzip");
httpPost.setEntity(stringEntity);
然而還是亂碼...
這要怎么搞?會不會是中文在類加載的時候就已經(jīng)是亂碼了呢?
于是我把項目重新改了一遍過,全改成UTF-8編碼
編譯和啟動的時候時候都加上了-Dfile.encoding=UTF-8參數(shù),然后
curl "http://localhost:8080/env`查了也是`"file.encoding":"UTF-8"
這樣應該沒啥問題了吧?
還是亂碼...
后來老大說了句硬編碼什么的,意識到,可能把所有中文抽出來應該會好
因為抽出來的配置文件可以直接查看文件編碼屬性之類的。
然后刷刷刷把中文抽到配置文件,啟動的時候讀取文件里面的內(nèi)容,果然,這下好了。
我暗暗發(fā)誓,以后這種中文硬編碼一定要抽到配置文件!!
當然問題還沒有最終解決,還沒找到根本原因
查了很多gradle項目亂碼的資料,主要的思路就是源文件必須是UTF-8格式,編碼之后也必須是UTF-8。
- 把這個目錄下的encoding改成UTF-8
eclise:windows->preference->General->Workspace
eclise:windows->preference->General->Content Types - 重新導入項目
- gradle.build加入編譯編碼設置
tasks.withType(JavaCompile) {
options.encoding = "UTF-8"
}
然而...完全不想說話
一段時間之后,偶然發(fā)現(xiàn),啟動項目(main所在的jar)上的中文編碼沒亂碼,但是其他子項目(jar)上的中文亂碼!這就奇怪了啊,但也許問題的出路就在這里!我試著單獨把每個子項目的編譯參數(shù)后都加上-Dfile.encoding=UTF-8,但依然還是這個問題。
最后一招,在gradle.build上作文章:
allprojects {
tasks.withType(JavaCompile) {
options.encoding = "UTF-8"
}
}
然后,好了!
好想哭啊,傻逼了!
但總結出來的思路確實就是源文件必須是UTF-8格式,編碼之后也必須是UTF-8。