Python字符串、默认编码和解码(UTF-8?)

3
根据我的阅读(包括这篇文章),默认情况下 Python 使用 UTF-8 进行编码。字符串在假定它们以 UTF-8 编码的情况下进行读取(更多来源)。
然后,使用 Latin-1、UCS-2 或 UCS-4 对整个字符串进行转换为普通 Unicode,具体取决于它遇到的 UTF-8 的最高代码点。这似乎与我在终端上所做的相匹配。字符 Ǧ 具有 Unicode 代码点 486,只能适应 UCS-2。
string1 = "Ǧ"
sys.getsizeof(string1)  # This prints 76 
string1 = "Ǧa"
sys.getsizeof(string1)  # This prints 78, as if 'a' takes two bytes

string2 = "a"
sys.getsizeof(string2)  # This prints 50 
string2 = "aa"
sys.getsizeof(string2)  # This prints 51, as if 'a' takes one byte

我有两个问题。 首先,当在终端打印时,字符串是如何编码和解码的?如果我们调用print(),那么字符串是否首先被编码为UTF-8(从UCS-2或Latin-1转换),然后系统解码它以打印到屏幕上? 其次,字符串大小的初始增量是什么意思?为什么用Latin-1表示的字符串具有49的初始大小,而使用UCS-2表示的字符串具有74的初始大小?
谢谢!

好问题,Rice先生。 - OneRaynyDay
1个回答

1
大部分你所提到的点都与PEP 393:灵活的字符串表示有关。尽管在Python 3中使用UTF-8作为默认源代码编码,但文件I/O的默认编码是基于本地设置的,而内部表示形式是ASCII、latin-1、UTF-16或UTF-32,取决于最大代码点,可能带有缓存的UTF-8表示和/或缓存wchar_t表示以供特定C API使用(在wchar_t表示的情况下是已弃用的API)。
因此,回答你的问题:
  1. 终端编码,如注意事项所述,是平台相关的;内部表示形式被重新编码为平台需要的内容并输出为字节。

  2. 在ASCII和UTF-16字符串之间的基本大小变化是由于灵活的字符串表示在非ASCII字符串中使用了更大的基线结构(它需要额外的空间来存储某些C级别API所需的缓存UTF-8编码的指针),以及每个字符更多的字节。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接