2016-12-27 33 views
1

私がする必要があるのは、例として最もよく説明されています。私は私の全体のアプリケーションのアーキテクチャを変更し、JSONを介してクライアントへのファイルの内容であると考えられる文字列を送信し、javascriptを経由してファイルを生成したい今PythonからJavaScriptへの "windows-1251"エンコード文字列の送信

content = u'<?xml version="1.0" encoding="windows-1251"?>\n' + ... # 
with open(file_name, 'w') as f: 
    f.write(content.encode('cp1251')) 
    f.close; 

: 以前、私は次のコードを持っていました。

だから、今私のコードは次のようなものになります、そして、

response_data = {} 
response_data['file_content'] = content 
response_data['file_name'] = file_name  
return JsonResponse({'content':json.dumps(response_data, ensure_ascii=False).encode('utf8')}) # error generated 

response_data = {} 
response_data['file_content'] = content.encode('cp1251') 
response_data['file_name'] = file_name  
return JsonResponse({'content':json.dumps(response_data, ensure_ascii=False)}) # error generated 

を問題は、私は私も目のオプションこの方法を試してみましたUnicodeDecodeError: 'ascii' codec can't decode byte 0xd4 in position 53: ordinal not in range(128)

を得るということですクライアントでは、utf8をwindows-1251に変換しようとします。

$.post ('/my_url/', data, function(response) { 
     var file_content = JSON.parse(response.content).file_content; 
     file_content = UnicodeToWin1251(file_content); 

...でも...歪んだシンボルが表示されます。 私はここでひどく間違っていることを知っていますし、エンコーディングで物事を混乱させる可能性がありますが、それでも私はこの問題を解決することができませんでした。誰かが私のミスのヒントを教えてもらえますか?

答えて

2

XMLとJSONの両方に、ユニコードテキストのデータが含まれています。 XML宣言は、XMLパーサにそのデータのXMLシリアル化をデコードする方法を伝えるだけです。 XMLヘッダに一致するようにシリアル化を手作業で書いたので、CP-1251にエンコードする必要がありました。

JSON標準では、すべてのJSONをUTF-8、UTF-16またはUTF-32のいずれかでエンコードする必要があります。これは、のシリアル化のエンコードだけです。

データをUnicodeのままにして、そのデータをjsonライブラリを使用してJSONにエンコードします。ライブラリはUTF-8データ(Python 2)を確実に取得するか、UTF-8に後でエンコードできるUnicodeテキスト(Python 3)を提供します。ここでJSON上でバイナリデータを送信する一切必要はありません

response_data = {} 
response_data['file_content'] = content 
response_data['file_name'] = file_name  
return JsonResponse({'content':json.dumps(response_data, ensure_ascii=False)}) 

、あなたがテキストを送信している:あなたのJavascriptコードは、その時あなたは再びUnicodeテキストを持っているポイント再びJSONをデコードします。 JavaScriptコードがのファイルを生成すると、Pythonコードではなく、がCP-1251にエンコードされます。

バイナリデータをJSONペイロードに入れる必要がある場合は、そのペイロードを何らかの形式のテキストにエンコードする必要があります。バイナリーデータをBase64としてテキストで符号化することができる(及びCP-1251でエンコードされたテキストは、バイナリデータである):

import base64 

response_data = {} 
response_data['file_content'] = base64.encodestring(content.encode('cp1251')).decode('ascii') 
response_data['file_name'] = file_name  
return JsonResponse({'content':json.dumps(response_data, ensure_ascii=False)}) 

Base64でデータのみASCIIデータを含むバイト文字列に符号化され、そうするためのASCIIとしてデコードされますテキストをUnicodeテキストにするJSONライブラリ。

Base64のテキストエンコードでラップされたバイナリデータをJavascriptクライアントに送信しています。ここでバイナリペイロードが必要な場合はBase64をデコードする必要があります。

+0

私はエンコーディングについて言及していないと、コンテンツはutf-8になることを正しく理解していますか? –

+1

@EdgarNavasardyan:Python 2のPython 'json'ライブラリは、互換性を最大限に高めるため、デフォルトではUTF-8にエンコードします。あなたのJavascriptコードは正しい、有効なJSONを受け取り、Javascriptオブジェクト(Unicodeテキストを含む)に再度デコードすることができます。 –

関連する問題