2013-07-31 61 views
2

我有一個Python 2.7的Django + AngularJS應用程序。有一個輸入字段輸入到數據模型中,並使用Angular的$ http將數據發送到服務器。當輸入字段包含字符「é」時,Django不喜歡它。當我使用「★é」時,Django沒有問題。在我看來,latin1字符集之​​外的星號字符將編碼強制爲utf-8,而當唯一的非拉丁字符是「é」時,Angular將數據作爲latin1發送,這會混淆我的Python代碼。AngularJS中的Latin1/UTF-8編碼問題

從Django中的錯誤信息是: UnicodeDecodeError錯誤:無效延續字節

告訴simplejson.loads()函數在服務器上讀取數據:在位置0「UTF8」編解碼器不能解碼字節0xe9使用ISO-8859-1(latin1)編碼在我的輸入字符串中只包含é並且沒有星號時工作正常,因此證明來自瀏覽器的數據是latin1,除非被非latin1字符強制爲utf-8 ,就像明星一樣。

有沒有辦法告訴Angular總是使用utf-8發送數據?

將數據發送到服務器的角度代碼:

$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

嗨,你只是一個想法 是否有可能改變「Accept-Charset」http頭文件和$ httpProvider.defaults.headers配置對象,如下所示:http://docs.angularjs.org/api /ng.$http – koolunix

回答

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.htmlhttp://www.JSON.org/json2.js發現JSON庫解釋。

+1

如果我嘗試以下方法,它仍會失敗:●⚫⚫☀☀⨁⊖⊛⊛⦿⨀◉○○⚪⚪⚬◯◯ – Heliodor