經過URL傳中文參數時,在服務端後臺獲取到的值每每會出現亂碼。解決方案有不少種。本文介紹如何經過encodeURI來解決中文亂碼問題。javascript
首先,在前端頁面準備參數的時候,須要對中文參數進行encode處理:html
var url = 'HelloWorldServlet?star_name='+ encodeURI(encodeURI("劉德華")); window.open(url);
其次,在服務端後臺程序代碼中用java.net.Decoder進行解碼,從而獲得中文參數的真實值:前端
String starName = java.net.URLDecoder.decode(request.getParameter("star_name"),"UTF-8");
目的達到了。哈哈,很簡單吧。不過此時你可能有個疑問,前端在進行encode編碼是,爲何用了兩次encodeURI,而服務器後端在解碼時只解了一次?java
緣由是:容器會默認幫你解一次碼。後端
此時,你可能又要問了,既然容器會默認解一次碼,那麼爲何不直接在前端只進行一次encode,服務端程序直接request.getParameter(「star_name」) ?多此一舉了吧?服務器
緣由是:容器默認解碼時採用的編碼是容器的默認編碼,多是UTF-8,GBK,也多是其餘編碼方式。這與你的應用的編碼方式未必會一致。因此你直接獲取的話可能會出現亂碼。編碼
固然也能夠經過修改容器的默認編碼,而實現「前端一次encode——後端直接獲取」的途徑獲取中文參數。url
例如:Tomcat的默認編碼修改方式:spa
修改%TOMCAT_HOME%/conf/server.xml,找到這行代碼:.net
<Connector port="8080" protocol="HTTP/1.1" redirectPort="8449" connectionTimeout="20000"/>
在後面能夠追加URIEncoding屬性,例如:
<Connector port="8080" protocol="HTTP/1.1" redirectPort="8449" connectionTimeout="20000" URIEncoding="UTF-8"/>
若是不方便改容器默認編碼方式,或者應用程序自己就有多種編碼方式的話,仍是採起本文給出的解決方案,經過「前端兩次encode——後端一次decode」的途徑獲取中文參數吧。