1

私の 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 エンコーディングでコーディングする必要があります。

4

1 に答える 1