python json unicode utf-8処理まとめ

3978 ワード

1.直接出力辞書中国語pythonで直接print dict(辞書)に遭遇したり、dictがjsonを回転したりすることがよくありますが、特定のパラメータを与えずにjson文字列を印刷し、出力した中国語がunicodeコードになった場合、以下のようにします.
d = {'name': '  ', 'age': '1'}
print d
jd = json.dumps(d)
print jd

出力結果:
{'age': '1', 'name': '\xe5\xbc\xa0\xe4\xb8\x89'}
{"age": "1", "name": "\u5f20\u4e09"}

この状況はどうしますか.辞書の中国語の正しい出力を行うには、dをjson文字列に変換し、変換時にjsonを使用することができる.dumps(d, ensure_ascii=False, encoding='utf-8'))
d = {'name': '  ', 'age': '1'}
print d
jd = json.dumps(d, ensure_ascii=False, encoding='utf-8'))
print jd

出力結果:
{'age': '1', 'name': '\xe5\xbc\xa0\xe4\xb8\x89'}
{"age": "1", "name": "  "}

パラメータensure_ascii=Falseは少なくできません.encodingは省略できます.デフォルトはencoding='utf-8'です.パラメータensure_についてです.asciiの解釈:
    If ``ensure_ascii`` is true (the default), all non-ASCII characters in the
    output are escaped with ``\uXXXX`` sequences, and the result is a ``str``
    instance consisting of ASCII characters only.  If ``ensure_ascii`` is
    ``False``, some chunks written to ``fp`` may be ``unicode`` instances.
    This usually happens because the input contains unicode strings or the
    ``encoding`` parameter is used. Unless ``fp.write()`` explicitly
    understands ``unicode`` (as in ``codecs.getwriter``) this is likely to
    cause an error.

パラメータencodingの説明について:
``encoding`` is the character encoding for str instances, default is UTF-8.

2.pythonが持参するjsonライブラリでjsonを辞書出力に変換し、出力はunicodeコードでjsonを使用する.loads(json_str)はjson_str文字列を辞書に変換する場合、辞書の内容はunicodeコードで、具体的には以下の通りです.
ud = json.loads(jd, encoding='utf-8')
print ud

出力結果:
{u'age': u'1', u'name': u'\u5f20\u4e09'}

辞書の文字列に付いているuは、uを取り除くには、yamlライブラリのyamlを使用する方法が2つあります.safe_load(jd)
import yaml
d = {'name': '  ', 'age': '1'}
print d
jd = json.dumps(d, ensure_ascii=False, encoding='utf-8'))
ud = json.loads(jd, encoding='utf-8')
print ud
ud = yaml.safe_load(jd, encoding='utf-8')
print ud

結果は次のように出力されます.
{u'age': u'1', u'name': u'\u5f20\u946b'}
{'age': '1', 'name': u'\u5f20\u946b'}

視覚が鋭い学生は、2番目のnameの値の前にuがあることを発見する可能性があります.つまり、彼はunicodeコードです.確かに、上の第1点はすでに説明して、直接辞書を印刷して、辞書の中の中国語は文字化けして、しかしどうしてunicodeコードで、もっと深い分析が必要で、知っている友达が伝言を惜しまないことを望んで、ありがとうございます.
bトランスコード関数を再帰的に実現するjson.loads()が返す辞書はunicodeコードから自分の欲しいコードに変換され、以下のように実現される.
def byteify(input, encoding='utf-8'):
    if isinstance(input, dict):
        return {byteify(key): byteify(value) for key, value in input.iteritems()}
    elif isinstance(input, list):
        return [byteify(element) for element in input]
    elif isinstance(input, unicode):
        return input.encode(encoding)
    else:
        return input

使用例:
d = {'name': '  ', 'age': '1'}
print d
jd = json.dumps(d, ensure_ascii=False, encoding='utf-8'))
ud = json.loads(jd, encoding='utf-8')
print ud
ud = byteify(ud)
print ud
print ud['name']

出力結果は次のとおりです.
{u'age': u'1', u'name': u'\u5f20\u946b'}
{'age': '1', 'name': '\xe5\xbc\xa0\xe9\x91\xab'}
  

今回は徹底的にjsonをloads()が返す辞書変換コードはutf-8になりましたが、出力はなぜ文字化けしているのでしょうか.冒頭の最初の点で言ったように、直接print辞書では、中国語は文字化けしますが、print ud['name']は正常に中国語の'張三'を表示します.参照元:https://stackoverflow.com/questions/956867/how-to-get-string-objects-instead-of-unicode-from-json