java后端請求兌現(xiàn)request的中文亂碼問題解決
處理方案
工作中遇到了請求對象中的屬性出現(xiàn)中文亂碼的問題,最初想到的處理方案就是嘗試將亂碼字符串進行解碼,嘗試過了很多解碼方式,然而結(jié)果并不理想,做好的結(jié)果解釋解決了一部分亂碼的問題。。。。
String str1="嫻嬭瘯"; System.out.println(new String(str1.getBytes("gbk"))); String str2="鐧誨綍鍚?"; System.out.println(new String(str2.getBytes("gbk")));
結(jié)果如下:
正常情況下我們所期望的結(jié)果時(測試、登錄名)
- 可以很明顯的看出,但字符數(shù)為偶數(shù)個的時候還好,但是當字符為奇數(shù)的時候就會有問題。而且一般像那種亂碼中帶了
?
類似的奇怪符號的根本無法再解出來。 - 想到了奇數(shù)和偶數(shù)字符編碼的問題,有些處理亂碼經(jīng)驗的程序員可以想到gbk和ut8的編碼轉(zhuǎn)換問題。
1.簡單的推理
我們來復現(xiàn)一下,代碼如下:
String str2="登錄名"; System.out.println(new String(str2.getBytes("utf-8"),"gbk"));
結(jié)果如下:
看,這不就是我們之前用gbk解碼之前的亂碼字符串嗎,很容易得出結(jié)論,和我們后臺交互的服務的編碼時utf-8,但是我們默認使用的解碼規(guī)則時gbk。。。。。
至于為什么gbk和utf-8都有中文編碼,但是互轉(zhuǎn)會亂碼以及奇數(shù)和偶數(shù)亂碼的問題,我就不再贅述了,可以參考如下文章gbk和utf-8轉(zhuǎn)換亂碼問題解析
2.解決
既然已經(jīng)找到問題的所在了,現(xiàn)在要著手解決問題了,后端項目用的springboot,設置了編碼的utf-8,所以tomcat的編碼應該也沒有問題,業(yè)務代碼中也沒有編碼的修改,那么就可能時過濾器或者這邊的攔截器有問題,突然想起來之前項目對接了一個認證平臺,加入了第三方提供的一個過濾器,可能他們提供的過濾器編碼有問題,查看過濾器的配置,發(fā)現(xiàn)沒有編碼的配置。em~,可能他們提供的過濾器有默認編碼。。。
好家伙,對著新加入的過濾器一陣翻找,還真發(fā)現(xiàn)了他編碼相關(guān)的參數(shù),好吧,他什么都沒有
這個時候就想辦法給他設置一下編碼,再過濾器中設置對應的編碼
Map<String, String> initParameters = new HashMap<String, String>(); initParameters.put("encoding", "utf-8"); filter.setInitParameters(initParameters);
設置編碼之后,之前中文亂碼的問題處理好了。
3.提示
這只是適合我遇到問題的處理場景,編碼的問題說簡單也簡單,說難也難,當生產(chǎn)環(huán)境出現(xiàn)了亂碼的問題,沒法復現(xiàn)和調(diào)試就更加惱火,這時候可以請求你的技術(shù)組長或者相關(guān)大佬,你踩過的坑說不定他們已經(jīng)遇到過,這樣能快速處理問題,避免繼續(xù)卡住影響后續(xù)的工作;當然,時間足夠的情況下可以深入研究,畢竟總有天賦異稟的人能第一個吃螃蟹。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
ConcurrentHashMap線程安全及實現(xiàn)原理實例解析
這篇文章主要介紹了ConcurrentHashMap線程安全及實現(xiàn)原理實例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-11-11springboot2中HikariCP連接池的相關(guān)配置問題
這篇文章主要介紹了springboot2中HikariCP連接池的相關(guān)配置問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-12-12