python - 为什么我的 Python 程序在 IntelliJ 中出现 UnicodeDecodeError 但在命令行中却正常?

标签 python json encoding intellij-idea

我有一个简单的程序可以加载一个包含有趣角色的 .json 文件。该程序(见下文)在终端中运行良好,但在 IntelliJ 中出现此错误:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 2: ordinal not in range(128)

关键代码是:

with open(jsonFileName) as f:
    jsonData = json.load(f)

如果我将 open 替换为:

with open(jsonFileName, encoding='utf-8') as f:

然后它可以在 IntelliJ 和终端中工作。我还是 Python 和 IntelliJ 插件的新手,我不明白它们为什么不同。我认为 sys.path 可能不同,但输出让我认为这不是原因。有人可以解释一下吗?谢谢!

版本:

  • 操作系统: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-错误-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。编码-temp.json

["™"]

最佳答案

JSON .load() 函数需要 Unicode 数据,而不是原始字节。 Python 自动尝试使用默认编解码器(在您的情况下为 ASCII)将字节字符串解码为 Unicode 字符串,但失败了。通过使用 UTF-8 编解码器打开文件,Python 会为您进行显式转换。查看open() function ,其中指出:

In text mode, if encoding is not specified the encoding used is platform dependent.

将使用的编码确定如下:

这一切都是用 C 语言完成的,但它在 Python 中的等价物是:

if encoding is None:
    encoding = os.device_encoding()
if encoding is None:
    encoding = locale.getpreferredencoding(False)
if encoding is None:
    encoding = 'ASCII'

因此,当您在终端中运行程序时,os.deviceencoding() 返回'UTF-8',但在 IntelliJ 下运行时没有终端,并且如果也没有设置语言环境,python 使用 'ASCII'

Python Unicode HOWTO告诉你所有关于 unicode 字符串和 bytestrings 之间的区别,以及编码。关于该主题的另一篇重要文章是 Joel Spolsky 的 Absolute Minimum Unicode knowledge article .

关于python - 为什么我的 Python 程序在 IntelliJ 中出现 UnicodeDecodeError 但在命令行中却正常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12409224/

相关文章:

c# - 有没有办法在不知道解码值编码的情况下确定 base64 编码值的长度?

python - "thinc.extra.MaxViolation has wrong size"的 Spacy-nightly (spacy 2.0) 问题

python - 如何为 spaCy 的标点符号功能添加自定义符号?

python - 获取 lxml 中的项目符号列表

java - 如何获取包含 JSONObject 的列表的大小?

json - 如何清理进入 Sinatra 应用程序的所有参数?

c# - 接收字符串作为内存流并进行编码后,将添加更多字符

Python:为什么这段代码会永远(无限循环?)

json - 如何将两个简单的 JSON 数组与 JQ 合并在一起

java - Dash 编码将 java 函数转换为 PHP