【问题标题】:Latin1/UTF-8 Encoding Problems in AngularJSAngularJS 中的 Latin1/UTF-8 编码问题
【发布时间】:2013-07-31 16:59:54
【问题描述】:

我有一个 Python 2.7 Django + AngularJS 应用程序。有一个输入字段输入数据模型,数据使用 Angular 的 $http 发送到服务器。当输入字段包含字符“é”时,Django 不喜欢它。当我使用“★é”时,Django 没有问题。在我看来,在 latin1 字符集之外的星形字符会强制编码为 utf-8,而当唯一的非拉丁字符是“é”时,Angular 将数据作为 latin1 发送,这会混淆我的 python 代码。

来自 Django 的错误消息是: UnicodeDecodeError:“utf8”编解码器无法解码位置 0 的字节 0xe9:无效的继续字节

告诉服务器上的 simplejson.loads() 函数使用 ISO-8859-1 (latin1) 编码读取数据当我的输入字符串中只包含 é 而没有星号时工作正常,因此证明了来自浏览器的数据是 latin1,除非被非 latin1 字符(如星号)强制为 utf-8。

有没有办法告诉 Angular 总是使用 utf-8 发送数据?

将数据发送到服务器的 Angular 代码:

$http({
    url: $scope.dataUrl,
    method: 'POST',
    data: JSON.stringify({recipe: recipe}),
    headers: {'Content-Type': 'application/json'}
}).success(...).error(...);

读取数据的Django代码:

recipe = simplejson.loads(request.raw_post_data)['recipe']

【问题讨论】:

  • 您好,只是一个想法-是否可以使用 $httpProvider.defaults.headers 配置对象更改“Accept-Charset”http标头,如此处所述:docs.angularjs.org/api/ng.$http

标签: django angularjs character-encoding


【解决方案1】:

我找到了一种可行的方法,使用 transformRequest 配置参数。

transformRequest: function (data, headersGetter) {
    return encode_utf8(JSON.stringify(data));
}

function encode_utf8(s) {
  return unescape(encodeURIComponent(s));
}

我正在使用在 http://ecmanaut.blogspot.com/2006/07/encoding-decoding-utf8-in-javascript.html 找到并解释的编码函数和在 http://www.JSON.org/json2.js 找到的 JSON 库。

【讨论】:

  • 如果我尝试仍然失败: ● ⚫ ☀ ⨂ ⨁ ⊕ ⊖ ⊛ ⦿ ⨀ ? ⌾ ◉ ? ○ ○ ⚪ ⚬ ◯ ◐ ◑ ◓ ◒ ⧇
猜你喜欢
  • 2020-09-15
  • 2010-12-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-24
  • 2010-11-26
相关资源
最近更新 更多