当前位置: 首页 > 知识库问答 >
问题:

如何传递Unicode字符作为JSP/Servletrequest.get参数?

伍耀
2023-03-14

经过多次尝试和错误,我仍然无法解决这个问题。JSP、servlet和数据库都设置为接受UTF-8编码,但即使在使用请求时也是如此。getParameter对于任何具有任何两字节字符(如em破折号)的对象,它们会被置乱为断字符。

我已经向数据库进行了手动提交,它能够接受这些字符,没问题。如果我在servlet中从数据库中提取文本并以jsp页面的形式打印它,它会显示没有问题。

我唯一一次发现它以破碎字符的形式返回是在使用request.get参数检索后尝试在其他地方显示它。

还有其他人有这个问题吗?我该怎么修?

共有3个答案

严宸
2023-03-14

Tomcat常见问题解答很好地涵盖了这个主题。尤其:http://wiki.apache.org/tomcat/FAQ/CharacterEncoding#Q8和http://wiki.apache.org/tomcat/FAQ/CharacterEncoding#Q4

常见问题解答中给出的测试JSP本质上就是我几年前在处理Tomcat时使用的一个JSP,用于解决各种编码问题。

江飞章
2023-03-14

巴卢斯克的回答是正确的,但我只想补充一点(当然对于POST方法而言)很重要

request.setCharacterEncoding("UTF-8");

在读取任何参数之前调用。以下是读取参数的实现方式:

@Override
public String getParameter(String name) {
    if (!parametersParsed) {
        parseParameters();
    }
    return coyoteRequest.getParameters().getParameter(name);
}

如您所见,当您第一次读取任何参数时,会设置一个标志parametersParsed,parseParameters()方法解析所有请求的参数并设置编码。打电话:

request.setCharacterEncoding("UTF-8");

参数解析后将无效!这就是为什么一些人抱怨设置请求的编码不起作用。这里的大多数答案建议使用servlet过滤器并在那里设置字符编码。这是正确的,但也要注意,一些安全库可以在筛选之前读取请求参数(这是我的情况),因此,如果在已设置请求参数的字符编码之后执行筛选,则设置UTF-8或任何其他设置将无效。

薛鹏飞
2023-03-14

如果根本没有正确设置请求和/或响应编码,则可能会发生这种情况。

对于GET请求,您需要在servlet容器级别配置它。尚不清楚您使用的是哪一个,但例如Tomcat,这将由中的属性完成

<Connector ... URIEncoding="UTF-8">

对于POST请求,您需要创建一个过滤器,该过滤器映射到涵盖所有这些POST请求的所需URL模式上。例如。*. jsp甚至/*。在doFilter()中执行以下工作:

request.setCharacterEncoding("UTF-8");
chain.doFilter(request, response);

对于超文本标记语言响应和提交的超文本标记语言表单输入值的客户端编码,您需要设置JSP页面编码。将其添加到JSP顶部(考虑到显示UTF-8直接表单数据库效果良好,您可能已经正确地完成了)。

<%@page pageEncoding="UTF-8" %>

或者为了防止在每个JSP上复制它,请在web.xml中配置一次:

<jsp-config>
    <jsp-property-group>
        <url-pattern>*.jsp</url-pattern>
        <page-encoding>UTF-8</page-encoding>
    </jsp-property-group>
</jsp-config>

对于源代码文件和stdout(IDE控制台),需要设置IDE工作区编码。不清楚您使用的是哪一个,但例如Eclipse,这将通过设置窗口来完成

请注意HTML<代码>

  • Unicode-如何正确使用字符
  • 为什么POST不支持字符集,而AJAX请求支持字符集?tomcat 6
  • HTML:表单不发送UTF-8格式输入
  • servlet应用程序中的Unicode字符显示为问号
  • 写入数据库时UTF-8编码错误(读取正常)
 类似资料:
  • 问题内容: 我正在将ajax发布到webmethod上,我可以在客户端(通过Firebug)看到请求的状态为200,但未达到我的webmethod中的停止点(webmethod的第一行)。json参数一切正常,但是通过反序列化json的方式,我不得不将其更改为字符串。 js: aspx: 问题答案: 您在jQuery JSON帖子中缺少内容类型: 请参阅本文。当我遇到类似的问题时,它对我很有帮助:

  • 问题内容: 我在网上找到了这段代码,其中有一部分我不理解。对于doInBackground方法,传递的参数为。有人可以告诉我这是什么意思吗?那是什么 问题答案: doInBackground(String… params) // params represents a vararg. new AsyncHttpPost().execute(s1,s2,s3); // pass strings to

  • 问题内容: 我正在创建一种通过传递搜索字段从任何表中选择ID的方法。 但是我得到一个有关语法错误的MySqlException。当我查看“异常”消息时,它向我显示带引号的查询表!如何将表格作为不带引号的参数传递? 问题答案: 大多数数据库不允许您通过参数指定表名或列名。参数用于 值 。如果确实确实需要使它动态化,则应验证输入(它应该是一个已知的表名,并且该表中具有已知的列名),然后将其包括在SQL

  • 问题内容: 我的密码 第一个文件: 第二档: 在上面的代码中,仅将“数据”字典的键传递给,但我希望键值对传递。如何纠正呢? 我希望这样被修改 这是我的要求,根据此给出答案 编辑: 字典键 类 更改为 标准 问题答案: 如果要像这样使用它们,请正常定义变量名称的函数: 现在,您可以在 调用 函数时使用: 它会按您想要的方式工作。 PS 请勿使用。等保留字(例如,改用)

  • 问题 你要写一个扩展模块,需要将一个Python字符串传递给C的某个库函数,但是这个函数不知道该怎么处理Unicode。 解决方案 这里我们需要考虑很多的问题,但是最主要的问题是现存的C函数库并不理解Python的原生Unicode表示。 因此,你的挑战是将Python字符串转换为一个能被C理解的形式。 为了演示的目的,下面有两个C函数,用来操作字符串数据并输出它来调试和测试。 一个使用形式为 c

  • 问题内容: 我想将字符串数组作为参数传递给函数。请看下面的代码 代替: 但是如果我这样做,我会收到一条错误消息,指出将其转换为。我想知道是否可以传递这样的值,或者正确的方法是什么? 问题答案: 怎么样: