Getリクエストパラメータで中国語の文字化けの問題を解決する
表示する前のヒント:
この記事で使用されているIDEAバージョンは究極の2019.1、JDKバージョンは1.8.0_141、Tomcatバージョンは9.0.12です。
数日前のプロジェクトで、getを使ってURLリクエストを送信し、中国語でパラメータを送信すると、文字化けが発生しました。インターネットで理由を検索したところ、次のような解決策がありました。
1.encodeURI
1.1フロントエンド
コードのフロントエンドjspページの部分は次のとおりです
<script type="text/javascript">
function doSubmit(){
var url = "${pageContext.request.contextPath}/test/testEncodeURI"
+ "?userName=" + encodeURI(encodeURI("张三"));
window.location.href = url;
}
</script>
注意
1.2舞台裏
バックグラウンドテストコントローラーは次のとおりです
package com.example.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
import java.net.URLDecoder;
/**
* 测试Controller
* @author jjy
* @date 2020-07-21
*/
@Controller
@RequestMapping("/test")
public class TestController {
/**
* 测试encodeURI
* @param request
* @return
*/
@RequestMapping("testEncodeURI")
public String testEncodeURI(HttpServletRequest request){
String userName = request.getParameter("userName");
System.out.println("Before encodeURI : " + userName);
try {
userName = URLDecoder.decode(userName, "UTF-8");
} catch (Exception e){
e.printStackTrace();
}
System.out.println("After encodeURI : " + userName);
return "index";
}
}
注意
結果は以下のとおりです。
1.3まとめ
-
エンコードとデコードのプロセスは次のとおりです
。UTF-8エンコード-> UTF-8(iso-8859-1)エンコード-> iso-8859-1デコード-> UTF-8デコード、エンコードとデコードのプロセスは対称的であるため、表示されません。文字化け。 -
フロントエンドencodeURIを2回:
encodeURI関数はエンコードにutf-8を使用し、サーバーがデコードしているとき、デフォルトではuft-8によってデコードされないため、文字化けした文字が表示されます。
EncodeURIを2回実行すると、最初のエンコードで取得されたURLはUTF-8であり、2番目のエンコードで取得されたURLは引き続きUTF-8ですが、実際には、最初にUTF-8エンコードを実行するのと同じです(現時点ではすべてASCII文字に変換されています)。UTF-8エンコーディングとISO-8859-1エンコーディングは英語の文字に対して同じ効果があるため、iso-8859-1エンコーディングが再度実行されます。 -
バックグラウンドデコード:バックグラウンドで
パラメーターを受信する場合、最初にrequest.getParameter()(gb2312、gbk、utf-8、iso-8859-1、および結果に影響を与えないその他の文字セットの場合があります)を介して最初に自動的にデコードし、ascii文字を取得します。 、次に、通常java.net.URLDecoder( ""、 "UTF-8")メソッドを使用して、2番目のデコードにUTF-8を使用します。