【问题标题】:Charset encoding problems with JSP, JQuery and JavascriptJSP、JQuery 和 Javascript 的字符集编码问题
【发布时间】:2013-08-30 17:12:36
【问题描述】:

我在基于 Web 的应用程序中遇到了一些字符集编码问题。尽管我已经正确配置了页面编码,但特殊字符仍然被截断。

我使用 JQuery Easy UI 插件来完成大部分工作,但问题也出现在简单的 jQuery/Javascript 代码中,例如警报框。

JSP 页面标题:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%> <!-- "ISO-8859-1" -->
<html>
 <head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
(...)

jQuery 代码:

$.fn.altStatusTarefa = 
function (idStat, idTar){
    var motivo =prompt("Informe o motivo da alteração:",
            "(Descrição suscinta)");
    if (motivo!=null && motivo!="")
      {
            var result = $.post("TarefaUpdateStatus", {
                                    idTarefa : idTar, 
                                    idStatus : idStat,
                                    motivoAlt : motivo 
                                } 
                            );
                result.done(function( data ) {
                     $.messager.show({
                        title:'Sucesso',
                        msg:'A alteração foi processada. ' +
                            'Tecle F5 para atualizar o formulário.',
                        showType:'show'
                        });
                });
                result.fail(function(jqXHR, textStatus) {
                    $.messager.alert('Erro',
                            'Houve um problema na atualização: ' + 
                            textStatus,'error');
                 });
                result.always({
                });
        }
    else{
            alert("Alteração cancelada.");
        }
     };

所有这些特殊字符(ã、ç、é 等)在运行时都会被截断。

对可能发生的情况或解决方案有什么想法吗?谢谢!

【问题讨论】:

  • 您可能需要确保您的代码编辑器也使用 UTF-8。
  • 截断是什么意思?文件是否被错误地提供给浏览器,或者只是错误的警报?能不能用 Chrome 开发工具或者 Firebug 看一下 JS 文件的内容类型是什么?

标签: javascript jquery html jsp jquery-easyui


【解决方案1】:

在 URL TarefaUpdateStatus 后面的 servlet 中,获取第一个请求参数之前执行以下调用:

request.setCharacterEncoding("UTF-8");

更好的是,在映射到/* 的URL 模式的servlet filter 中完成这项工作,这样您就不需要在所有servlet 上复制粘贴这一行。如果你碰巧使用 Spring,它的库中就有这样一个过滤器。

这一行将告诉 servletcontainer 使用 UTF-8 来解码 URL 编码的 POST 请求参数。否则,它将为此使用容器的默认字符集,通常是 ISO-8859-1,这只会导致这些参数值以 Mojibake 结尾。

请注意,这不包括 GET 请求参数。这需要在servletcontainer端进行配置。

另见:

【讨论】:

  • 值得您回答,但不幸的是设置请求字符集不起作用。我已将此语句放在过滤器中,在调试期间我看到它正在处理但结果仍然相同。我忘了说我在 JSP 页面之外的单独文件中使用了 javascript。我在 JSP 中输入的所有内容都已正确解析,但如果我使用类似 javaScript/jQuery 中的简单警报之类的东西,它会显示为“Mojibake”(以防葡萄牙语中的特殊字符 - ç、ã、ê、é 等) .感谢您的回复。
  • 你的意思是,那些在 JS 文件中的硬编码消息?因此,您的 JS 文件不是由编辑器使用 UTF-8 保存的吗?我了解到您在谈论提交的值。
  • 这很尴尬,也很讨厌。但我不知道发生了什么。数据库服务器设置为 UTF-8,使用 jQuery Easy UI 的表单发送的数据正在正确地向 DB 提交数据,相同的数据正确显示在 JSP 页面的简单表格中。但是当我在 javaScript 文件或 DataGrid (jeasyui) 中的数据中显示警报时,不会解析特殊字符。由于我设置了请求字符集和 JSP 页面字符集,我想知道我忘记做什么了。再次感谢。
  • 你验证过JS文件是用正确的编码保存的吗?
  • 我已经检查并保证了 .js 文件编码,一切正常。但是猜猜...另一方面,我进行了一个测试,如果将简单文本放在 JSP 文件中的
【解决方案2】:

在搜索响应的传奇之后,我设法获得了解决方案。

首先,我的问题通过三个步骤解决,以实现对整个应用程序的正确解析:

  1. 将 Eclipse 中的所有 .js 文件转换为 UTF-8 字符集(不是默认值)。在Eclipse中,右键.js文件-属性-资源-字符集编码区-选择UTF-8;之后,文件中的所有特殊字符都应该被截断。它们必须更换为新的(可能在某处有自动转换,请随意研究);它解决了每个外部 javascript 代码中的 Mojibakes 字符问题,例如“警报”(JSP 页面中的脚本表现良好)。

  2. 所有使用response.getWritter().write("...") 的响应都应使用response.setCharacterEncoding("UTF-8") 进行编码;您也可以使用@BalusC 在另一个答案中所写的过滤器。例如,它通过 jQuery Easy UI Messager 插件解决了消息传递问题。

  3. 从 DB 检索的数据(确保您的 DB 也使用 UTF-8!)实现 jQuery Easy UI DataGrid 插件由 Spring 管理的控制器通过 JSON (Gson) 编码。在这种情况下,您应该在@RequestMapping Spring 注解中使用语句produces={"application/json; charset=UTF-8"},如this question 中的Jensen 所述。

请注意,我没有在这个答案中谈到数据插入,相反的数据流,只是因为它没有影响我的系统(它已经配置好了)。但是您可能会发现知道 jQuery Easy UI 上有一些功能可以做到这一点,请求设置也是有用的。

我几乎写了一个教程,因为这个非常无聊的问题困扰了我两天,我真的希望帮助其他人(特别是那些处理非英语语言的人)不要对这些东西感到无聊。感谢@BalusC 的宝贵帮助。

编辑:及时,this post 对字符集编码很有用。

【讨论】:

    猜你喜欢
    • 2011-01-04
    • 1970-01-01
    • 1970-01-01
    • 2011-11-02
    • 2014-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-12
    相关资源
    最近更新 更多