2

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

来自 Django 的错误消息是:UnicodeDecodeError: 'utf8' codec can't decode byte 0xe9 in position 0: invalid continuation byte

当我的输入字符串仅包含 é 而没有星号时,告诉服务器上的 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']
4

1 回答 1

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找到的 JSON 库。 org/json2.js

于 2013-08-03T00:23:39.540 回答