é、ñ、Áなどの文字を含む文字列を含むjson Webサービスを構築しています。
Python を使用して、コンソールで実行すると完全に機能する次のコード スニペットを見つけました。
import json
string = "NIÑO, ÁRBOL, HÉROE"
print json_dumps({'string': string}, ensure_ascii=False, encoding='utf-8')
問題は、私が Django を使用していることですが、上記のコードほど単純ではないようです。これは、views.py ファイルで行っていることの一部です。
import json
from models import *
from django.http import HttpResponse
from django.db.models import Q
def jsonService(request):
# The following line performs a query at the db
myObjects = MyObjects.objects().filter( Q(...) )
result = {"string": myObject[0].field } # let's say myObject[0].field contains "NIÑO, ÁRBOL, HÉROE"
# Prepares a response
response = HttpResponse(json.dumps(result, ensure_ascii=False, encoding="utf-8"))
# Sets the heades of content type and its charset
response['Content-type'] = 'application/json; charset=utf-8'
# Returns the response we prepared
return response
このコードの出力は次のとおりです。
{
string : "NIôO, ÃRBOL, HÃ%ROE"
}
結果オブジェクトをアセンブルするときに、python の関数 repr() を文字列 myObject[0].field に適用すると、驚いたことに結果は次のようになります。
{
string : "NI\xc3\u2018O, \xc3\x81RBOL, H\xc3\u2030ROE"
}
ここから推測できるのは、db が配信する文字列 (python の type() によると Unicode 文字列) が utf-8 以外の形式でエンコードされている可能性があるということですが、次のエラーが表示されます。
'ascii' codec can't decode byte 0xc3 in position 14: ordinal not in range
これらのエスケープされた文字は、私には非常に奇妙に思えます。言うまでもなく、ユニコード文字列ではなく、アクセント付きの文字 ({string: "NIÑO, ÁRBOL, HÉROE"} のようなもの) は必要ありません。 Google サービスはアクセントで動作します。
いくつかのアドバイス?たぶん、私が気づいていない信じられないほど間違ったことをしているのかもしれません。そのため、プロセス全体を説明しました。