8

jsonこれは、標準ライブラリモジュールを使用して私には可能ではないようです。使用json.dumpsすると、すべての非 ASCII 文字が自動的にエスケープされ、文字列が ASCII にエンコードされます。非 ASCII 文字をエスケープしないように指定できますが、出力を ASCII に変換しようとするとクラッシュします。

問題は -私は ASCII が欲しくない! JSON 文字列をUnicode (またはUTF-8 ) 文字列として戻したいだけです。それを行う便利な方法はありますか?

ここに私が欲しいものを示す例があります:

d = {'navn': 'Åge', 'stilling': 'Lærling'}
json.dumps(d, output_encoding='utf8')
# => '{"stilling": "Lærling", "navn": "Åge"}'

しかしもちろん、output_encodingのようなオプションはないので、実際の出力は次のとおりです。

d = {'navn': 'Åge', 'stilling': 'Lærling'}
json.dumps(d)
# => '{"stilling": "L\\u00e6rling", "navn": "\\u00c5ge"}'

要約すると、Python dict をエスケープなしでUTF-8 JSON 文字列に変換したいと考えています。どうやってやるの?


次のような解決策を受け入れます。

  • dumpsハック (目的の効果を達成するための前処理と後処理の入力)
  • JSONEncoderのサブクラス化(どのように機能するのかわかりませんし、ドキュメントもあまり役に立ちません)
  • PyPi で利用可能なサードパーティ ライブラリ
4

3 に答える 3

7

要件

  • Python ファイルが UTF-8 でエンコードされていることを確認してください。そうしないと、ASCII 以外の文字が疑問符 (?) になります?。Notepad++ には、このための優れたエンコード オプションがあります。

  • 適切なフォントが含まれていることを確認してください。日本語の文字を表示したい場合は、日本語フォントをインストールする必要があります。

  • IDE が Unicode 文字の表示をサポートしていることを確認してください。そうしないと、UnicodeEncodeErrorエラーがスローされる可能性があります。

例:

UnicodeEncodeError: 'charmap' codec can't encode characters in position 22-23: character maps to <undefined>

PyScripter は私のために働きます。http://portablepython.com/wiki/PortablePython3.2.1.1の「Portable Python」に含まれています。

  • このバージョンはより優れた Unicode サポートを提供するため、Python 3+ を使用していることを確認してください。

問題

json.dumps() は Unicode 文字をエスケープします。

解決

一番下のアップデートを読んでください。または...

エスケープされた各文字を、解析された Unicode 文字に置き換えます。

まさにそれを行うという単純なラムダ関数を作成しましたgetStringWithDecodedUnicode

import re   
getStringWithDecodedUnicode = lambda str : re.sub( '\\\\u([\da-f]{4})', (lambda x : chr( int( x.group(1), 16 ) )), str )

ここでgetStringWithDecodedUnicodeは、通常の機能として。

def getStringWithDecodedUnicode( value ):
    findUnicodeRE = re.compile( '\\\\u([\da-f]{4})' )
    def getParsedUnicode(x):
        return chr( int( x.group(1), 16 ) )

    return  findUnicodeRE.sub(getParsedUnicode, str( value ) )

testJSONWithUnicode.py (PyScripter を IDE として使用)

import re
import json
getStringWithDecodedUnicode = lambda str : re.sub( '\\\\u([\da-f]{4})', (lambda x : chr( int( x.group(1), 16 ) )), str )

data = {"Japan":"日本"}
jsonString = json.dumps( data )
print( "json.dumps({0}) = {1}".format( data, jsonString ) )
jsonString = getStringWithDecodedUnicode( jsonString )
print( "Decoded Unicode: %s" % jsonString )

出力

json.dumps({'Japan': '日本'}) = {"Japan": "\u65e5\u672c"}
Decoded Unicode: {"Japan": "日本"}

アップデート

または... ensure_ascii=Falsejson.dumpsのオプションとして渡すだけです。

注: 最初に概説した要件を満たす必要があります。そうでない場合、これは機能しません。

import json
data = {'navn': 'Åge', 'stilling': 'Lærling'}
result = json.dumps(d, ensure_ascii=False)
print( result ) # prints '{"stilling": "Lærling", "navn": "Åge"}'
于 2012-07-28T08:48:19.340 に答える
6

encode_ascii=False私見の最良のソリューションです。

Python2.7 を使用している場合は、Python ファイルの例を次に示します。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# example.py
from __future__ import unicode_literals
from json import dumps as json_dumps
d = {'navn': 'Åge', 'stilling': 'Lærling'}
print json_dumps(d, ensure_ascii=False).encode('utf-8')
于 2014-03-07T10:13:06.610 に答える