servlet 得到?而不是 unicode 字符(波斯语)
servlet get ? instead unicode character(persian)
我有一个非常简单的 html,带有一个提交按钮和一个文本框,用于将 unicode(波斯语)文本发送到 servlet 并 运行 它在 weblogic 上。我在 jsp 页面和 request.setCharacterEncoding("UTF-8") 中设置了 charset=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"));
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()
并自己将其解析为单独的参数,然后 URL从一开始就使用正确的编码进行解码。这是更多的工作,但至少您可以使您的应用程序 运行 在人们已经完成 (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 字节,或者使用 UTF 在 System.out
上创建一个新的 PrintStream -8 作为编码。
我有一个非常简单的 html,带有一个提交按钮和一个文本框,用于将 unicode(波斯语)文本发送到 servlet 并 运行 它在 weblogic 上。我在 jsp 页面和 request.setCharacterEncoding("UTF-8") 中设置了 charset=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"));
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()
并自己将其解析为单独的参数,然后 URL从一开始就使用正确的编码进行解码。这是更多的工作,但至少您可以使您的应用程序 运行 在人们已经完成 (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 字节,或者使用 UTF 在 System.out
上创建一个新的 PrintStream -8 作为编码。