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

时间:2018-07-22 00:35:29

标签: python string input unicode utf-8

根据我自己的读物(包括this article),似乎默认情况下Python使用UTF-8编码。在假定字符串采用UTF-8编码(more source)的情况下读入字符串。

然后根据整个字符串遇到的UTF-8的最高代码点,对整个字符串使用Latin-1,UCS-2或UCS-4将这些字符串转换为纯Unicode。这似乎与我在终端上所做的匹配。字符Ǧ的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?

谢谢!

1 个答案:

答案 0 :(得分:2)

您的大部分观点与PEP 393: Flexible string representation有关。尽管使用UTF-8(在Python 3上)作为默认的源代码编码,但文件I / O的默认编码是基于语言环境的,内部表示形式为ASCII,latin-1,UTF-16或UTF-32,具体取决于在最大的代码点上,可能具有缓存的UTF-8表示形式和/或缓存的wchar_t表示形式,以用于特定的C API(在wchar_t表示形式中已弃用的API)。

所以回答您的问题:

  1. 如上所述,终端编码为platform dependent;内部表示形式将重新编码为平台所需的任何形式,并以字节输出。

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