JSP、JQuery和Javascript的字符集编码问题

Charset encoding problems with JSP, JQuery and Javascript

本文关键字:字符集 编码 问题 Javascript JQuery JSP      更新时间:2023-09-26

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

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

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

在搜索响应的过程中,我终于找到了一个解决方案。

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

  1. 将Eclipse中的所有.js文件转换为UTF-8字符集(不是默认值)。在Eclipse中,右键单击.js文件-属性-资源-字符集编码区-选择UTF-8;之后,文件中的所有特殊字符都应该被截断。它们必须被替换为新的(可能在某个地方有自动转换功能,可以随意研究);它解决了Mojibake在每个外部javascript代码中处理字符的问题,比如"alerts"(JSP页面中的脚本做得很好)。

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

  3. 从数据库中检索到的数据(请确保您的数据库也使用UTF-8!)正在由Spring管理的控制器通过JSON(Gson)对实现jQuery Easy UI DataGrid插件的数据进行编码。在这种情况下,您应该在@RequestMappingSpring注释中使用语句produces={"application/json; charset=UTF-8"},正如Jensen在本问题中所描述的那样。

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

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

编辑:这篇文章对字符集编码非常有用。

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

request.setCharacterEncoding("UTF-8");

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

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

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

另请参阅:

  • Unicode-如何正确输入字符