1

我在基于 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.");
        }
     };

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

关于可能发生的事情或解决方案的任何想法?谢谢!

4

2 回答 2

3

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

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

  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) 编码的。在这种情况下,您应该使用 Spring 注释中的语句produces={"application/json; charset=UTF-8"}@RequestMappingJensen此问题中所述。

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

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

编辑:及时,这篇文章对字符集编码很有用。

于 2013-08-29T19:44:40.580 回答
1

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

request.setCharacterEncoding("UTF-8");

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

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

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

也可以看看:

于 2013-08-28T01:40:32.767 回答