PyCharm 远程解释器是否引入了编码问题?

Does PyCharm remote interpreter introduced encoding issue?

我有下面这段代码报错:

 def get_name(self, name_dir):
       
        name = {}
        for cnt, line in enumerate(open(name_dir, 'r')):
            id, gname = line.strip().split('\t')
            name[id] = gname
        return name

错误信息:

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

我在 Mac 和 Ubuntu 机器上 运行 在 python3 本地,没有错误。但是,当我在 PyCharm 中设置远程解释器以在 ubuntu 机器上使用相同的 python3 解释器时,它会报告错误。

我通过将 encoding='utf8' 添加到文件 'open' 函数来解决问题。这是否意味着 PyCharm 在配置远程解释器时引入了错误?

不,PyCharm 做它应该做的事情。

问题是 你在 Mac 和 Ubuntu 上都在本地尝试过,这很好,但这隐藏了你的本地计算机有 locales,可能支持UTF-8,但远程计算机不支持。

现在,默认情况下,大多数 Linux 发行版都会使用 UTF-8 语言环境安装用户,所以我假设两者之一(从我的角度来看,第二种更有可能):

  • 您安装 Ubuntu 时使用的图像非常小,没有很多(或任何)语言环境。或者您要使用的语言环境未安装,Ubuntu 只找到默认语言环境作为回退(C 语言环境)。

  • 或者您正在使用 root。 Root 通常(并且为了可移植性)仅使用 C 语言环境,它仅支持 ASCII 字符集。

因此,我假设在您的远程计算机中您没有使用 UTF-8 语言环境。尝试 运行 export LANG=en_US.utf8(一个非常常见的语言环境),看看是否可以解决问题,或者只是与本地 [=72= 中的 echo $LANG returns 相同的字符串](或Mac)。注意:locale -a 将列出所有已安装的语言环境(当然,您必须 install/activate 其他语言环境)。

注意:原因是您使用的是 root,您需要做出艰难的决定:将默认 root 语言环境设置为 en_US.utf8C.utf8(在非交互式 shell保持 Cen US 作为语言,否则许多脚本将失败)。

我个人的看法:root 程序应该只写 ASCII 字符。 UTF-8 数据有文件和日志。要在控制台中写入,只需使用回退 replacebackslashreplace(出于安全原因,我永远不会在 root 中使用 ignore)。

无论如何,您的代码也不理想,您发现编写 encoding='utf8' 可以解决问题。 Python 咒语包括:explicit is better than implicit,所以如果你知道 name_dir 的编码,就使用它,而不是让 Python (而不是 PyCharm) 来找出本地编码(在您的情况下,它似乎是 ASCII)。 Python 使用 locale.getpreferredencoding 查找默认语言环境。

所以,它不是 PyCharm,但问题出在您的远程语言环境中(Python 默认使用它)。我会通过在 open(和 write)上明确编码来解决这个问题。但是,如果您没有 运行 将程序设置为 root,我还会检查为什么您的远程用户默认情况下不使用 UTF-8 语言环境。