1. 程式人生 > 其它 >URL傳中文引數導致亂碼的解決方案之encodeURI

URL傳中文引數導致亂碼的解決方案之encodeURI

URL傳中文引數導致亂碼的解決方案之encodeURI
https://blog.csdn.net/zhxtpray/article/details/52440076?utm_source=blogxgwz1

[size=large]       通過URL傳中文引數時,在服務端後臺獲取到的值往往會出現亂碼。解決方案有很多種。本文介紹如何通過encodeURI來解決中文亂碼問題。

首先,在前端頁面準備引數的時候,需要對中文引數進行encode處理:

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,而伺服器後端在解碼時只解了一次?

原因是:容器會預設幫你解一次碼。

此時,你可能又要問了,既然容器會預設解一次碼,那麼為什麼不直接在前端只進行一次encode,服務端程式直接request.getParameter(“star_name”) ?畫蛇添足了吧?

原因是:容器預設解碼時採用的編碼是容器的預設編碼,可能是UTF-8,GBK,也可能是其他編碼方式。這與你的應用的編碼方式未必會一致。所以你直接獲取的話可能會出現亂碼。

當然也可以通過修改容器的預設編碼,而實現“前端一次encode——後端直接獲取”的途徑獲取中文引數。

例如:Tomcat的預設編碼修改方式:

修改%TOMCAT_HOME%/conf/server.xml,找到這行程式碼:

<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”的途徑獲取中文引數吧。

That’s all ![/size]