【问题标题】:Problems with UTF-8 encoding, JSP, jQuery, SpringUTF-8 编码、JSP、jQuery、Spring 的问题
【发布时间】:2011-11-02 11:38:57
【问题描述】:

我在 apache tomcat 6 中有一个带有 spring、jsp 和 jquery 的 Web 应用程序,一个 jsp 页面有一个表单,该表单通过使用 jquery 进行的 ajax 调用将数据发送到我后端的 Spring MultiActionController。

问题在于表单输入中的 UTF-8 字符串。

我已经做了以下事情:

在我的 HTML 上:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<%@ page contentType="text/html; charset=utf-8" %>
<%@ page language="java" pageEncoding="utf-8"%>

<html>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
<head> 
.
.

关于 jquery ajax 调用:

$.ajaxSetup({ scriptCharset: "utf-8" ,contentType: "application/x-www-form-urlencoded; charset=UTF-8" });
    $.ajax(
        {
            type: "GET",
            url: "./saveData.action",
            contentType: "charset=utf-8",
            data: { name: $('#name').val(),...

在tomcat server.xml上:

<Connector connectionTimeout="20000" port="8080" URIEncoding="UTF-8" protocol="HTTP/1.1" redirectPort="8443"/>

在多动作控制器上

public ModelAndView saveData(HttpServletRequest request,HttpServletResponse response) 
    throws ServletException, IOException 
    {
        request.setCharacterEncoding("UTF-8");
        String name = request.getParameter("name");

所以如果在 name 参数中我放了这样的东西:

玛丽亚

在后台我得到了

玛拉。

我已经尝试了所有我读到的东西,但我不知道是什么错误,谢谢你的帮助:)

【问题讨论】:

    标签: jquery jsp spring-mvc utf-8 character-encoding


    【解决方案1】:

    在您获得变量中的参数之前,一切看起来都很好。只是您的后端仍需要配置为使用 UTF-8。例如,System.out.println() 或您将检索到的参数发送到的记录器也应该使用 UTF-8。或者您存储检索到的参数的数据库也应该使用 UTF-8。或与该数据库交互的 JDBC 驱动程序。或者您要写入数据的文本文件。等等。

    另见:


    与您的具体问题无关,行

    request.setCharacterEncoding("UTF-8");
    

    应该在 Spring 启动之前执行。它设置 POST 请求编码,只要 Spring 在执行操作之前确定请求主体,这就会失败(请注意,此行对 GET 请求完全没有影响)。 Spring 有一个CharacterEncodingFilter 正是这样做的。在你的web.xml注册这个:

    <filter>
        <filter-name>characterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    
    <filter-mapping>
        <filter-name>characterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    

    【讨论】:

    • 感谢 BalusC,我更改了 DB 和 de web.xml,现在可以正常工作了 :)
    • 如何将其添加到 web.xml?在 ... 标签内?因为当我这样做时,我的项目没有成功运行。
    • 我遇到了同样的问题,将过滤器添加到 xml 就可以了。我不确定我的开发服务器上是否安装了 utf-8,但我正在手动转换为 unicode。
    【解决方案2】:

    我在使用 Characters 时遇到了同样的问题,我通过以下方式解决了它:

    request.setCharacterEncoding("utf-8");
                    StringBuffer requestContent = new StringBuffer();
                    do
                    {
                        bytesRead = request.getInputStream().readLine(bytes,0,bytes.length);
                        if(bytesRead > 0)
                        {
                            requestContent.append(new String(bytes,0,bytesRead,"UTF-8"));
                        }
                    }
                    while(bytesRead > 0);
    

    然后从 requestContent 中获取以“name="

    开头的字符串

    【讨论】:

    • request.setCharacterEncoding() 对 GET 请求完全没有影响。 request.getInputStream() 对 GET 请求不返回任何内容。这是 Tomcat 的 &lt;Connector&gt; 中的 URIEncoding,它对 GET 请求很重要。这已经正确设置了。尽管如此,您提出的方法是一种解决方法,而不是解决方案。
    猜你喜欢
    • 2011-08-04
    • 2019-10-02
    • 1970-01-01
    • 2010-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多