2

é、ñ、Áなどの文字を含む文字列を含む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 サービスはアクセントで動作します。

いくつかのアドバイス?たぶん、私が気づいていない信じられないほど間違ったことをしているのかもしれません。そのため、プロセス全体を説明しました。

4

1 に答える 1

3

あなたのviews.pyでこれを試してみてください.pyは私にとってはうまくいきます

from django.utils import simplejson
from django.core.serializers.json import DjangoJSONEncoder

def jsonService(request):

    myObjects = MyObjects.objects().filter( Q(...) )
    fields = [x.field for x in myObjects] # creates a list of all fileds 

    # it will create JSON object
    result=simplejson.dumps({
        'fileds':fileds,
     })

    return HttpResponse(result, mimetype='application/json')
于 2012-12-17T04:41:28.970 に答える