我有一个非常简单的html,其中包含一个提交按钮和一个文本框,该文本框将一个unicode(波斯语)文本发送到servlet并在weblogic上运行它。我在jsp页面中设置了charset = UTF-8和request.setCharacterEncoding(“UTF-8”);在servlet中,但是当我从请求获取参数并将其打印或插入数据库时,它是??? 我也使用URLDecoder,但它没有帮助。我怎么能解决这个问题? HTML代码:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
</head>
<body>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<fmt:requestEncoding value="UTF-8" />
<form method="get" action="main">
<input type="submit" name="search" value="جستجو" >
<input type="text" name="keyWord" class="bodyfont" >
</form>
</body>
</html>
servlet代码:
request.setCharacterEncoding("UTF-8");
String input = URLDecoder.decode(request.getParameter("keyWord"), "UTF-8");
System.out.println(input);
System.out.println(request.getParameter("keyWord"));
答案 0 :(得分:0)
String input = URLDecoder.decode(request.getParameter("keyWord"), "UTF-8");
该参数已由getParameter
按位进行了URL解码,因此外部URLDecoder.decode()
调用不会执行任何操作(可能会损坏实际值中的任何实际百分号)。
getParameter
在内部调用URLDecoder
时使用的编码是ISO-8859-1;上面对request.setCharacterEncoding
的调用不会影响查询字符串解码。 (它只影响POSTed表单,即使那样,除非你在过滤器中调用它,否则它通常不会起作用。)
在Servlet规范中解决这种极端跛足有三种选择:
特定于容器的选项,用于配置不同的查询字符串编码,例如Tomcat中的<Connector URIEncoding>
或Weblogic中的<java-charset-name>
;
接受该参数被错误解码,并以其他方式错误编码:new String(request.getParameter("foo").getBytes("iso-8859-1"), "utf-8")
;
抓取request.getQueryString()
并自己将其解析为单独的参数,然后从开始使用正确的编码进行URLDecode。这是更多的工作,但至少你可以让你的应用程序在人们做过的环境中一致地运行(1)。
System.out.println(input);
这本身很麻烦。终端可能不支持Unicode(特别是在Windows下),或者Java可能没有正确设置其默认编码。如果Java认为System.out
是ASCII或ISO-8859-1,那么它将无法打印任何波斯语,因此您将获得?
。 Java无法检测到终端编码和丰富的ASCII,这是很常见的。
可以使用-Dfile.encoding=...
覆盖默认值,但是为整个容器设置这很烦人。如果您确定终端确实支持UTF-8,您可以尝试使用getBytes
和System.out.write
手动编码为UTF-8字节,或者在System.out
上创建新的PrintStream使用UTF-8作为编码。