私の Java Web アプリケーションでは、URL を作成してからその URL を呼び出す必要があります。URL の作成中に、パラメーター値をエンコードしてURLEncoder.encode("text","UTF-8")
いますが、受信側でパラメーターを取得してデコードすると、適切にデコードされません。エンコードされた値をリクエスト属性として設定しようとしましたが、これは正常に機能します。しかし、クライアントの要求に従って使用することはできません。
URLEncoder & URLDecoder および URLCodec を Apache commons コーデック関数からテストするために、次のコードを作成しました。
StringBuffer sb = new StringBuffer("TestSpecialChar'` ~6 Æ æ Ç È 123");
//String testCharacters = "TestSpecialChar'` ~6 Æ æ Ç È 123";
String testCharacters = sb.toString();
try {
String encoded = URLEncoder.encode(testCharacters, "UTF-8");
System.out.println("URLEncoder : " + encoded);
System.out.println("URLDecoder : " + URLDecoder.decode(encoded, "UTF-8"));
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
URLCodec urlc = new URLCodec("UTF-8");
try {
String encoded = urlc.encode(testCharacters);
System.out.println("urlc.encode : " + encoded);
System.out.println("urlc.decode : " + urlc.decode(encoded));
} catch (EncoderException ee){
ee.printStackTrace();
} catch (DecoderException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
String encoded = urlc.encode(testCharacters);
System.out.println("urlc.encode : " + encoded);
System.out.println("URLDecoder : " + URLDecoder.decode(encoded, "UTF-8"));
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (EncoderException ee){
ee.printStackTrace();
}
このコードは完全に機能します。次に、2 つの JSP ページがあり、一方が URL にエンコードされた値を使用して他方を呼び出している単純な Web アプリケーションを作成しました。これは、受信側で適切にデコードされた値を示していません。参考までにコードはこちらです。
送信者.jsp:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ page language="java" import="java.net.URLEncoder"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Sender</title>
<script type="text/javascript">
function send(){
window.location='<%=request.getContextPath()%>/jsp/receiver.jsp?txt=<%=URLEncoder.encode("TestSpecialChar'` ~6 Æ æ Ç È 123","UTF-8")%>';
}
</script>
</head>
<body onload="javascript:send();">
</body>
</html>
レシーバー.jsp:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ page language="java" import="java.net.URLDecoder"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Receiver</title>
</head>
<body>
<%
if (request.getAttribute("encoded") != null){
URLDecoder.decode(request.getAttribute("encoded").toString(),"UTF-8");
}
if (request.getParameter("txt") != null){
%>
<%=URLDecoder.decode(request.getParameter("txt").toString(),"UTF-8")%>
inside if getparameter
<%
}
%>
</body>
</html>
ブラウザに次の出力が表示されます
TestSpecialChar'` ~6 × × × × 123 内部 if getparameter
それ以外の
TestSpecialChar'` ~6 Æ æ Ç È 123 内部 if getparameter
テストコードの何が問題なのか、属性が適切にデコードされているのにパラメータが正しくデコードされていないため、リクエスト属性とパラメータの違いは何ですか?
Temp solution:
次のことを行うことで解決しました:1)特定の文字をUTF 8コードに置き換えるクラスを作成しました。2) URL パラメータとしての文字データの受け渡しを削除しました。3) 外部 URL への呼び出しが UTF-8 でエンコードされていることを確認します。4) 外部 URL から受信した値、または値を使用する前にアプリケーションでデコードされた値。
Correct solution:
この問題を克服するには、i18n を念頭に置いてアプリケーションを設計およびコーディングし、すべての JSP ページを UTF-8 エンコーディングでコーディングする必要があります。