この小さなPythonプログラム:
#!/usr/bin/env python
# -*- coding: utf8 -*-
import json
import sys
x = { "name":u"This doesn't work β" }
json.dump(x, sys.stdout, ensure_ascii=False, encoding="utf8")
print
ターミナルで実行したときに、この出力が生成されます。
$ ./tester.py
{"name": "This doesn't work β"}
これはまさに私が期待するようです。私はstdoutをファイルにリダイレクトする場合は、それが失敗します。
$ ./tester.py > output.json
Traceback (most recent call last):
File "./tester.py", line 9, in <module>
json.dump(x, sys.stdout, ensure_ascii=False, encoding="utf8")
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 190, in dump
fp.write(chunk)
UnicodeEncodeError: 'ascii' codec can't encode character u'\u03b2' in position 19: ordinal not in range(128)
しかし、(json.dumpなし)ダイレクトプリントをファイルにリダイレクトすることができことができます。
print u"This does work β".encode('utf-8')
これは、JSONパッケージは無視するかのようだエンコーディング標準出力が端末でない場合はオプション。
どのように私は私がやりたいJSONパッケージを得ることができますか?
1つの最終的な答えにすべてのコメントや回答を統合:
注:この答えは、Python 2.7用です。Pythonの3は異なる可能性があります。
JSONスペックJSONファイルがUTF-8でエンコードされていることを述べています。しかし、PythonのJSONパッケージはチャンスを取るために好きではないので、ストレートアスキーを書き込み、出力でUnicode文字をエスケープします。
あなたは、設定することができensure_ascii JSONパッケージは、Unicode出力の代わりに、STRを生成します。その場合には、Falseにフラグを。その場合には、Unicodeの出力をエンコードすることはあなたの問題です。
JSONパッケージは、UTF-8または出力の他のエンコーディングを発生させる方法はありません。これは、いずれかのASCIIまたはUnicodeです。好きなのを選びな。
エンコードの引数には、赤いニシンでした。このオプションは、どのようにJSONパッケージ伝え入力文字列がエンコードされています。
ここでは、最終的に私のために働いていたものです:
ofile = codecs.getwriter('utf-8')(sys.stdout)
json.dump(x, ofile, ensure_ascii=False)
TL; DR:それはただの端末に行くのstdoutせたときに嘔吐しなかった理由本当の謎でした。それはstdout.writeは()出力が端末にしたときを検出し、$ LANG環境変数ごとにエンコードされたことが判明しました。出力をファイルになると、ユニコードは、ASCIIにエンコードされ、エラー結果が非符号化可能な文字が遭遇したとき。