我有一个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']
答案 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库。