【问题标题】:Angular http.get charsetAngular http.get 字符集
【发布时间】:2016-08-25 12:49:23
【问题描述】:

我无法让我的 Angular 应用程序正确解析我的 json 数据。

当我的 json-feed 包含例如{ "title": "Halldórsson Pourié" } 我的应用程序显示 Halld�rsson Pouri�

我认为问题出在字符集上,但我找不到在哪里更改它。

目前我正在使用 ng-bind-html 和 $sce.trustAsHtml(),我非常确定当 $http.get(url) 解析我的 json 时会出现问题。

那么我如何告诉 $http.get(url) 用特定字符集解析数据?

【问题讨论】:

  • 这是一个简单的问题,plnkr.co/edit/R4pzNAmWguMXcnkClyMX?p=preview,我无法复制这个问题。你能试一下复制它吗?
  • 我刚刚尝试将我的数据源放入您的 plunkr 中,但问题再次出现。当我检查我使用浏览器的数据源时,可能看不到 Angular 的数据。所以现在我发现数据源缺少一些字符集/编码数据,以便角度正确编码。谢谢你的帮助。
  • plnkr 毫无价值,因为问题在于服务器和客户端之间的连接。检查对我的答案的编辑。
  • 顺便说一下,我不确定您的控制器代码是否正确。

标签: angularjs character-encoding


【解决方案1】:

我遇到了类似的问题并通过以下方式解决了:

 encodeURIComponent(JSON.stringify(p_Query))

其中p_Query 是一个包含请求详细信息的 JSON(即您的 { "title": "Halldórsson Pourié" })。

编辑:

您可能还需要在 GET 请求的标头中添加以下内容:

 'Content-Type': 'application/x-www-form-urlencoded ; charset=UTF-8'

【讨论】:

  • 我对问题的解释可能有点不足。我从应用程序外部的 json-feed 获取数据。为了获取数据,我使用 angular $http-service。但是 $http-service 会自动解析 json 数据,并使用不包含我需要的特殊字符的 UTF-8(我猜)。因此,当我开始操作数据时,我的特殊字符已经转换为 ...。
  • @OngoBoingo,首先,UTF-8 包含您可能想象的所有字符集,当然是法语所需的所有字符集(如果我正确理解了您示例的语言)。其次,您是说将 JSON 传递给您的 Web 应用程序吗?在这种情况下,请定义您在服务器端拥有什么,谁在构建 JSON 以及谁在响应 GET 请求。
【解决方案2】:

在文本/JSON 字段中的重音字符和一些科学记数法方面存在同样的问题,发现无论我们尝试什么其他方法,AngularJS(或它使用的任何原生 JavaScript XHR/fetch 函数)都将所有内容扁平化为 UTF-8。

这里的另一位受访者声称 UTF-8 仍应以某种方式适应您的扩展字符集,但我们发现并非如此:直接对源数据进行采样,我们将其加载到具有不同编码的文本编辑器中,而 UTF-8 仍将将扩展字符压缩到该占位符。

在我们的例子中,编码是 ISO-8859-15,但 ISO-8859-1 可能就足够了。

尝试将此 $http 配置添加到您的 $http.get() 调用中,相应地:

$http.get(url, {
    responseType: 'arraybuffer',
    transformResponse: function(data) {
        let textDecoder = new TextDecoder('ISO-8859-15'); // your encoding may vary!
        return JSON.parse(textDecoder.decode(data));
    }
});

这应该拦截 AngularJS 默认的响应转换,而是在此处应用该函数。当然,您会考虑添加一些错误处理等。

如果没有自定义 transformResponse 函数有更好的方法,我还没有在 AngularJS 文档中找到任何内容。

【讨论】:

    【解决方案3】:

    $http.get(url, {responseType: 'arraybuffer', }).then(function (response) { var textDecoder = new TextDecoder('ISO-8859-1'); console.log(textDecoder.decode(response.data));});
    此代码会将您的所有 � 占位符替换为普通字符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-01
      • 2015-04-09
      • 2019-01-01
      • 2017-02-15
      • 2019-03-21
      相关资源
      最近更新 更多