【问题标题】:How to set encoding in .getJSON jQuery如何在 .getJSON jQuery 中设置编码
【发布时间】:2010-09-06 19:09:30
【问题描述】:

在我的网络应用程序中,我使用 jQuery 的 $.getJSON() 方法提交了一些表单字段。我在编码方面遇到了一些问题。我的应用程序的字符集是charset=ISO-8859-1,但我认为这些字段是用UTF-8 提交的。

如何设置$.getJSON 调用中使用的编码?

【问题讨论】:

  • 根据this的回答为application/json指定字符集是非法的。
  • 非法?我希望我不会因为试图...而被捕。

标签: jquery ajax json character-encoding


【解决方案1】:

如果您想使用$.getJSON(),您可以在调用前添加以下内容:

$.ajaxSetup({
    scriptCharset: "utf-8",
    contentType: "application/json; charset=utf-8"
});

你可以使用你想要的字符集来代替utf-8

选项解释here

contentType :向服务器发送数据时,使用这个content-type。默认为application/x-www-form-urlencoded,在大多数情况下都可以。

scriptCharset : 仅适用于具有 jsonpscript 数据类型和 GET 类型的请求。强制将请求解释为特定字符集。只有远程和本地内容之间的字符集差异才需要。

您可能需要一个或两个...

【讨论】:

  • 嗨 Pat,我在使用 getJSON 方法设置内容类型时遇到了同样的问题。我在调用 getJSON 之前使用了 $.ajaxSetup,但没有发生任何变化,“北欧”字符在我的数据库中变成了垃圾字符。你能告诉我调用数学的确切顺序吗?谢谢
  • 根据this的回答为application/json指定字符集是非法的。
  • 我在使用 post 时遇到了类似的问题,并且使用 $.ajax(...) 调用而不是 $.post(...) 因为我没有办法更改内容类型.这允许我使用缩写的 $.post 表示法来匹配我正在使用的 $.get。我相信这应该是公认的答案,因为它可以工作并允许使用 $.getJSON()。
【解决方案2】:

我认为如果要更改编码,您可能必须使用 $.ajax(),请参阅下面的 contentType 参数(successerror 回调假设您有 <div id="success"></div> 和 @987654328 @在html中):

$.ajax({
    type: "POST",
    url: "SomePage.aspx/GetSomeObjects",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    data: "{id: '" + someId + "'}",
    success: function(json) {
        $("#success").html("json.length=" + json.length);
        itemAddCallback(json);
    },
    error: function (xhr, textStatus, errorThrown) {
        $("#error").html(xhr.responseText);
    }
});

实际上我一个小时前就不得不这样做了,真是巧合!

【讨论】:

  • 我刚刚发现您在错误方法中覆盖了 XMLHttpRequest 主机对象。它只是一个良好的编码实践问题,不要混淆其他开发人员;)我建议将其重命名为其他名称;)
  • 好多了 :) (其实我现在的名字通常和你一样 :>)
  • 根据this的回答,为application/json指定字符集是非法的。
【解决方案3】:

您需要使用 Wireshark 分析 JSON 调用,因此您将看到是否在 JSON 页面的形成中包含字符集,例如:

  • 如果页面简单if text / html
0000 48 54 54 50 2f 31 2e 31 20 32 30 30 20 4f 4b 0d HTTP/1.1 200 正常。 0010 0a 43 6f 6e 74 65 6e 74 2d 54 79 70 65 3a 20 74 . 内容类型:t 0020 65 78 74 2f 68 74 6d 6c 0d 0a 43 61 63 68 65 2d ext/html ..缓存- 0030 43 6f 6e 74 72 6f 6c 3a 20 6e 6f 2d 63 61 63 68 控制:无缓存
  • 如果页面的类型包括自定义 JSON,MIME“charset = ISO-8859-1”
0000 48 54 54 50 2f 31 2e 31 20 32 30 30 20 4f 4b 0d HTTP/1.1 200 正常。 0010 0a 43 61 63 68 65 2d 43 6f 6e 74 72 6f 6c 3a 20 .缓存控制: 0020 6e 6f 2d 63 61 63 68 65 0d 0a 43 6f 6e 74 65 6e 无缓存..内容 0030 74 2d 54 79 70 65 3a 20 74 65 78 74 2f 68 74 6d t-类型:文本/htm 0040 6c 3b 20 63 68 61 72 73 65 74 3d 49 53 4f 2d 38 l;字符等=ISO-8 0050 38 35 39 2d 31 0d 0a 43 6f 6e 6e 65 63 74 69 6f 859-1..连接

这是为什么呢?因为我们不能在 JSON 的页面上放置这样的目标:

就我而言,我使用制造商 Connect Me 9210 Digi:

  • 我必须使用一个标志来表示将使用非标准 MIME: p-> theCgiPtr-> = fDataType eRpDataTypeOther;
  • 它在变量中添加了新的 MIME: strcpy(p->theCgiPtr->fOtherMimeType, "text/html; 字符集 = ISO-8859-1 ");

它对我有用,无需将 JSON 传递的数据转换为 UTF-8,然后在页面上重新进行转换...

【讨论】:

    【解决方案4】:

    在客户端 JS 中使用 encodeURI(),在服务器 Java 端使用 URLDecoder.decode()


    例子:

    • Javascript

      $.getJSON(
          url,
          {
              "user": encodeURI(JSON.stringify(user))
          },
          onSuccess
      );
      
    • Java

      java.net.URLDecoder.decode(params.user, "UTF-8");

    【讨论】:

      【解决方案5】:

      如果你想使用 $.getJSON() 你可以在调用之前添加以下内容:

      $.ajaxSetup({
          scriptCharset: "utf-8",
          contentType: "application/json; charset=utf-8"
      });
      

      【讨论】:

      • 对不起,您的回答与 @Pat 的 11 年 之前的回答有何不同?
      【解决方案6】:

      使用此功能重新获得 utf-8 字符

      function decode_utf8(s) { 
        return decodeURIComponent(escape(s)); 
      }
      

      示例: var new_Str=decode_utf8(str);

      【讨论】:

        猜你喜欢
        • 2012-11-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多