AngularJS中的Latin1 / UTF-8编码问题

时间:2013-07-31 16:59:54

标签: django angularjs character-encoding

我有一个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']

1 个答案:

答案 0 :(得分: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库。