如果我想使用 UTF-8 编码(python 的默认值),是否必须将我的字符串变量编码为字节变量?

If I want to use UTF-8 encoding, the default for python, do I have to encode my string variables to byte variables?

如果我有一个字符串,我想以编码为 UTF-8 的字节形式使用,我是否需要将变量编码为字节变量?或者,由于 Python 默认编码为 UTF-8,它会在某些上下文中将字符串视为 UTF-8 字节形式而无需显式编码吗?

例如,我正在从事一个项目,其中有一组将字符串映射到字符串的字典。如果我用 json.dump 将这个数组写入一个文件,然后用 json.load 读取它,字符串恢复得很好,而且我没有得到任何错误,尽管从未编码。这向我表明,如果您只是使用 UTF-8,则实际上不需要转换为字节形式。我错了吗?如果我是对的,这仍然是不好的做法吗?如果我只写没有 JSON 的字符串,我的例子会有什么不同吗?

Python 有多个关于编码的默认值。 在Python3中,情况如下:

  • 源文件编码默认为UTF-8。如果确实需要,您可以在模块的前两行 (# coding: latin-1) 之一中使用注释覆盖它。它只影响字符串文字(和变量名)。
  • str.encode()bytes.decode()encoding参数也是UTF-8。
  • 但是当你用open()打开文件时,默认的encoding取决于具体情况(OS,环境变量,Python版本,构建) .您可以使用 locale.getpreferredencoding() 检查其值。当您从 sys.stdin 读取或使用 print().
  • 时,也会使用此默认值

所以我认为在前两种情况下依赖默认值是可以的(官方建议在第一种情况下使用默认值)。 但是第三个是棘手的:在许多系统上 IO 默认是 UTF-8,因此您可能 认为 with open(path) as f: 将始终使用 UTF-8,因为它在开发,但随后您将脚本移植到不同的服务器,突然它引发 UnicodeErrors 或产生乱码。

处理文本通常不需要处理编码字符串(即 bytes 对象)。 相反,您确保在阅读文本时对其进行解码,并在 writing/sending 文本时对其进行编码。 对于使用 open() 创建的流,这是自动完成的(除非您指定二进制模式 'rb'/'wb')。 如果您认为 input/output 必须是 UTF-8,那么您应该在调用 open().

时显式指定 encoding='utf8'