如果我想使用 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'
如果我有一个字符串,我想以编码为 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'