首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >jQuery AJAX调用会导致字符编码混乱

问jQuery AJAX调用会导致字符编码混乱
EN

Stack Overflow用户
提问于 2010-07-07 20:30:06
回答 6查看 39.2K关注 0票数 8

我有一个输出JSON的servlet。servlet的输出编码是ISO8859-1。我们的webapp中的页面也被设置为ISO-8859-1。我会使用UTF-8,但这是我无法控制的;我们必须使用ISO-8859-1。

当我单独访问servlet时,我可以看到已经输出的JSON数据。字符编码是正确的,没有一个字符看起来奇怪。

但是,当我通过AJAX调用servlet并使用检索到的数据填充一个选择框时,我将�替换为(似乎)所有带有重音的字符(例如,我带有严重的或尖锐的口音、dieresis或回旋音)。当我查看Firebug下的Net选项卡中的响应时,我可以看到文本看起来很好。但是,当我使用这些数据填充复选框时,我会得到带问号的菱形。

这些字符都是有效的ISO-8859-1字符,所以我不明白为什么它们没有正确显示。

编辑

更多的信息。我在jQuery.ajax中使用jQuery.ajax,并将scriptCharset设置为ISO-8859-1。在服务器端,我已经使用request.setCharacterEncoding("ISO-8859-1");显式地将编码设置为ISO8859-1。

编辑

代码样本:

这就是我目前的情况。我加入了scriptCharset: "ISO-8859-1",但没有效果。

代码语言:javascript
复制
        jQuery.ajax({
            url: "/countryAndProvinceCodeServlet",
            data: data,
            dataType: "json",
            type: "GET",
            success: function(data) {
               ...
            },
        });

我的servlet使用org.json.JSONObject,只需执行response.getWriter().print(jsonObject.toString());输出字符串。

更新

根据关于JSON以及应该如何使用UTF-8的评论,我试图看看是否可以将数据作为文本(因此将dataType设置为text in jQuery.ajax),然后自己将其计算为JSON (在Javascript中)。这似乎也不管用!当我做console.log的时候,我仍然能得到时髦的钻石。然而,当我在Firebug中的Net选项卡下查看它时,一切都显示得很好:

Net选项卡:

代码语言:javascript
复制
{"error":false,
 "provinces":{"DZ-01":"Adrar",
              "DZ-16":"Alger",
              "DZ-23":"Annaba",
              "DZ-44":"Aïn Defla",
              "DZ-46":"Aïn Témouchent",
              "DZ-05":"Batna",
              "DZ-07":"Biskra",
              "DZ-09":"Blida",
              "DZ-34":"Bordj Bou Arréridj",
              "DZ-10":"Bouira",
              "DZ-35":"Boumerdès",
              "DZ-08":"Béchar",
              "DZ-06":"Béjaïa",
              "DZ-02":"Chlef",
              "DZ-25":"Constantine",
              "DZ-17":"Djelfa",
              "DZ-32":"El Bayadh",
              "DZ-39":"El Oued",
              "DZ-36":"El Tarf",
              "DZ-47":"Ghardaïa",
              "DZ-24":"Guelma",
              "DZ-33":"Illizi",
              "DZ-18":"Jijel",
              "DZ-40":"Khenchela",
              "DZ-03":"Laghouat",
              "DZ-29":"Mascara",
              "DZ-43":"Mila",
              "DZ-27":"Mostaganem",
              "DZ-28":"Msila",
              "DZ-26":"Médéa",
              "DZ-45":"Naama",
              "DZ-31":"Oran",
              "DZ-30":"Ouargla",
              "DZ-04":"Oum el Bouaghi",
              "DZ-48":"Relizane",
              "DZ-20":"Saïda",
              "DZ-22":"Sidi Bel Abbès",
              "DZ-21":"Skikda",
              "DZ-41":"Souk Ahras",
              "DZ-19":"Sétif",
              "DZ-11":"Tamanghasset",
              "DZ-14":"Tiaret",
              "DZ-37":"Tindouf",
              "DZ-42":"Tipaza",
              "DZ-38":"Tissemsilt",
              "DZ-15":"Tizi Ouzou",
              "DZ-13":"Tlemcen",
              "DZ-12":"Tébessa"}}

但是,当我用从console.log(text)获得的东西做jQuery.ajax时,我会得到以下信息:

代码语言:javascript
复制
{"error":false,
 "provinces":{"DZ-01":"Adrar",
              "DZ-16":"Alger",
              "DZ-23":"Annaba",
              "DZ-44":"A�n Defla",
              "DZ-46":"A�n T�mouchent",
              "DZ-05":"Batna",
              "DZ-07":"Biskra",
              "DZ-09":"Blida",
              "DZ-34":"Bordj Bou Arr�ridj",
              "DZ-10":"Bouira",
              "DZ-35":"Boumerd�s",
              "DZ-08":"B�char",
              "DZ-06":"B�ja�a",
              "DZ-02":"Chlef",
              "DZ-25":"Constantine",
              "DZ-17":"Djelfa",
              "DZ-32":"El Bayadh",
              "DZ-39":"El Oued",
              "DZ-36":"El Tarf",
              "DZ-47":"Gharda�a",
              "DZ-24":"Guelma",
              "DZ-33":"Illizi",
              "DZ-18":"Jijel",
              "DZ-40":"Khenchela",
              "DZ-03":"Laghouat",
              "DZ-29":"Mascara",
              "DZ-43":"Mila",
              "DZ-27":"Mostaganem",
              "DZ-28":"Msila",
              "DZ-26":"M�d�a",
              "DZ-45":"Naama",
              "DZ-31":"Oran",
              "DZ-30":"Ouargla",
              "DZ-04":"Oum el Bouaghi",
              "DZ-48":"Relizane",
              "DZ-20":"Sa�da",
              "DZ-22":"Sidi Bel Abb�s",
              "DZ-21":"Skikda",
              "DZ-41":"Souk Ahras",
              "DZ-19":"S�tif",
              "DZ-11":"Tamanghasset",
              "DZ-14":"Tiaret",
              "DZ-37":"Tindouf",
              "DZ-42":"Tipaza",
              "DZ-38":"Tissemsilt",
              "DZ-15":"Tizi Ouzou",
              "DZ-13":"Tlemcen",
              "DZ-12":"T�bessa"}}

在我看来,jQuery对数据做了一些奇怪的事情。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2010-07-07 22:05:07

我终于想出来了。太奇怪了!

response.setCharacterEncoding(String)做而不是工作(不知道它是否与我的设置或其他相关)。它看起来像是设置了字符编码,但由于某种原因,jQuery搞砸了这一切。显式设置标题如下:

代码语言:javascript
复制
response.setHeader("Content-Type", "application/json; charset=ISO-8859-1");

谢谢大家的帮助!

编辑

我做了一些研究,检查了一下JavaDocs,看到了这个:

如果协议提供了这样做的方法,容器必须将servlet响应的编写器所使用的字符编码通信到客户端。在HTTP情况下,字符编码作为文本媒体类型的内容类型标头的一部分进行通信。注意,如果servlet没有指定内容类型__,则不能通过headers 传递编码的字符;但是,它仍然用于编码通过servlet响应编写器编写的文本。

因此,上面的方法仍然有效,但是您也可以(而且可能应该)这样做:

代码语言:javascript
复制
response.setContentType("application/json");
response.setCharacterEncoding("ISO-8859-1"); 
票数 17
EN

Stack Overflow用户

发布于 2010-07-07 20:43:23

你能用UTF-8代替吗?

代码语言:javascript
复制
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

在PHP中,可以将JSON数据编码为UTF-8:

代码语言:javascript
复制
/**
 * Applies a UTF-8 encoding conversion for text.
 */
function utf8_enc( $rows ) {
  $encoded = array();

  foreach( $rows as $row ) {
    $temp = array();

    foreach( $row as $name => $value ) {
      $temp[ $name ] = $value = mb_convert_encoding( $value, 'auto', 'UTF-8' );
    }

    array_push( $encoded, $temp );
  }

  return $encoded;
}

function db_json( $query ) {
  echo json_encode( utf8_enc( db_fetch_all( db_query( $query ) ) ) );
}

我看到了一些奇怪的结果使用ISO-8859-1重音字符集。我切换到UTF-8,编码问题消失了。

至于它的价值,我已经将getJSON编码如下:

代码语言:javascript
复制
  $.getJSON( HOST + 'cat.dhtml', function( data ) {
    var h = '';
    var len = data.length;

    for( var i = 0; i < len; i++ ) {
      h += '<option value="' + data[i].id + '">' + data[i].name + '</option>';
      categories[ data[i].id ] = data[i];
    }

    $('#category').html(h);
  });
票数 2
EN

Stack Overflow用户

发布于 2010-07-07 22:25:33

在我看来,您收到了一个解析错误,因为响应数据被错误解码,因此包含了一些错误的字符。

您可以尝试在jQuery.ajax中插入一个附加参数

代码语言:javascript
复制
dataFilter : function ( data, type ) {
    alert(data);
    return data;
}

如果对所有非ASCII字符(‘If’、'é‘等)使用不同的字符,则可以尝试将错误的编码字符替换为正确的字符,并从dataFilter返回正确的编码数据。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3198532

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档