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