由于同事離職需要接手一個(gè)開發(fā)進(jìn)10年的struts項(xiàng)目,遇到了經(jīng)典的中文亂碼問題差购。
好好的項(xiàng)目四瘫,怎么到了我的手里,上傳文件就變成亂碼了呢欲逃?
仔細(xì)想想找蜜,排除了項(xiàng)目文件編碼設(shè)置的情況,肯定是因?yàn)榄h(huán)境問題稳析。
對(duì)比了生產(chǎn)環(huán)境洗做,結(jié)果發(fā)現(xiàn)tomcat配置不一樣。
這里先po出解決方案:
在tomcat/conf/server.xml文件中彰居,將Connector添加如下兩項(xiàng)配置URIEncoding和useBodyEncodingForURI竭望。
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000" redirectPort="8443"
URIEncoding="UTF-8" useBodyEncodingForURI="true"/>
至于這兩個(gè)配置的含義可以百度,大概意思如下:
URIEncoding:對(duì)URI中出現(xiàn)的中文進(jìn)行decode裕菠,解決X.do找不到執(zhí)行類的問題咬清。
useBodyEncodingForURI:解決queryString參數(shù)的亂碼問題。
我的問題就是這個(gè)啦
上述兩個(gè)配置不指定,默認(rèn)值為ISO-8859-1
具體情況分析:
1.調(diào)試前臺(tái)js代碼從uploadstart()直到上傳成功旧烧,文件名顯示正常影钉,頁面中文名鏈接渲染正常,說明問題不在js前端掘剪;
2.請(qǐng)求跳轉(zhuǎn)到后臺(tái)Action后直接從request中拿到的filename就已經(jīng)是亂碼平委,并且基類中已經(jīng)設(shè)置request.setCharacterEncoding("UTF-8");說明后臺(tái)就是拿UTF-8去解析參數(shù)的,沒有問題夺谁;
3.中文亂碼使用new String(fid.getBytes("ISO-8859-1"),"UTF-8")測(cè)試才為正常中文名稱廉赔,說明中間被什么中間件給轉(zhuǎn)成萬惡的ISO-8859-1了,事實(shí)上匾鸥,就是tomcat蜡塌!
心得體會(huì):
代碼問題不大的話,優(yōu)先檢查環(huán)境勿负!