面白いキャラクターを含む .json ファイルをロードする簡単なプログラムがあります。プログラム (以下を参照) はターミナルでは問題なく動作しますが、IntelliJ では次のエラーが発生します。
UnicodeDecodeError: 'ascii' コーデックは位置 2 のバイト 0xe2 をデコードできません: 序数が範囲外です (128)
重要なコードは次のとおりです。
with open(jsonFileName) as f:
jsonData = json.load(f)
open を次のように置き換えた場合:
with open(jsonFileName, encoding='utf-8') as f:
次に、IntelliJ とターミナルの両方で動作します。私はまだ Python と IntelliJ プラグインを使い始めたばかりで、なぜそれらが異なるのか理解できません。sys.path
違うかもしれないと思ったのですが、出力を見るとそれが原因ではないと思います。誰か説明してくれませんか?ありがとう!
バージョン:
- OS: Mac OS X 10.7.4 (10.6.8 でもテスト済み)
- Python 3.2.3 (v3.2.3:3d0686d90f55、2012 年 4 月 10 日、11:25:50) /Library/Frameworks/Python.framework/Versions/3.2/bin/python3.2
- IntelliJ: 11.1.3 アルティメット
ファイル (2):
1.unicode-error-demo.py
#!/usr/bin/python
import json
from pprint import pprint as pp
import sys
def main():
if len(sys.argv) is not 2:
print(sys.argv[0], "takes one arg: a .json file")
return
jsonFileName = sys.argv[1]
print("sys.path:")
pp(sys.path)
print("processing", jsonFileName)
# with open(jsonFileName) as f: # OK in Terminal, but BUG in IntelliJ: UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 2: ordinal not in range(128)
with open(jsonFileName, encoding='utf-8') as f: # OK in both
jsonData = json.load(f)
pp(jsonData)
if __name__ == "__main__":
main()
2.encode-temp.json
["™"]