在我的java Web应用程序中,我必须构造一个URL,然后调用URL。在创建URL时,我使用URLEncoder.encode("text","UTF-8")
对参数值进行编码但是当我们在接收端获取参数并对其进行解码时 - 它无法正确解码。我尝试将编码值设置为请求属性,这很好。但不能按照客户要求使用它。
编写以下代码来测试URLEncoder&来自Apache的URLDecoder和URLCodec通用编解码器函数。
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();
}
此代码完美无缺。然后我写了一个简单的Web应用程序,其中我有两个JSP页面,其中一个在URL中调用其他带有编码值的页面。这未在接收器端显示正确的解码值。以下是供您参考的代码。
sender.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>
receiver.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>
我在浏览器中得到以下输出
如果getparameterTestSpecialChar'`~6âÃ|ÃÃÃ123
而不是
如果getparameterTestSpecialChar'`~6ÆæÇÈ123
有人可以让我知道测试代码有什么问题吗?请求属性和参数有什么区别,因为属性被正确解码而参数没有?
Temp solution:
通过做以下事情来解决它:
1)创建了一个用UTF 8代码替换某些特定字符的类。
2)删除了作为URL参数传递的字符数据。
3)确保对外部URL的调用是UTF-8编码的。
4)从外部URL接收的任何值或在使用该值之前在应用程序中解码的值。
Correct solution:
为了克服这个问题,应用程序必须在设计和编码时考虑到i18n以及所有具有UTF-8编码的JSP页面。
答案 0 :(得分:1)
您将网址编码为UTF-8,但your JSP pages have these declarations in them:
<%@ page language="java"
contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
...
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
如果服务器将页面视为ISO-8859-1 instead of UTF-8,则可能会干扰您的编码。将您的pageEncoding
更改为UTF-8,看看是否能解决您的问题。