Python 2.x中的字符串使用哪种编码?

Cor*_*tex 6 python string encoding python-2.x python-internals

在python 2.x中编码字符串的默认编码是什么?我读过有两种方法可以声明一个字符串.

string = 'this is a string'
unicode_string = u'this is a unicode string'
Run Code Online (Sandbox Code Playgroud)

第二个字符串是Unicode.第一个字符串的编码是什么?

iva*_*eev 10

根据Python默认/隐式字符串编码和转换(简明地叙述其Py2部分,以最小化重复):

Python 2中实际上有多个独立的"默认"字符串编码,由其功能的不同部分使用.

  • 解析代码和字符串文字:

    • str 从文字中 - 将包含文件中的原始字节,不进行转码
    • unicode从文字 - 文件中的字节是decode'd与文件的"源编码"默认ascii
    • unicode_literals未来,文件中的所有文字都被视为Unicode的文字
  • 转码/类型转换:

    • str<->unicode类型转换和encode/ decodew/o参数完成sys.getdefaultencoding()
      • ascii几乎总是如此,所以任何国家角色都会导致UnicodeError
    • str只能是decode'd和unicode- encode'd.另外尝试将涉及隐式类型转换(具有上述结果)
  • I/O,包括print:

    • unicode- encode'd with <file>.encodingif set,否则隐式转换为str(带有上述结果)
    • str - 将原始字节写入流,不进行转码.对于国家字符,终端将根据其语言环境设置显示不同的字形.


Art*_*cca 6

字面上的答案是它们不一定代表任何特定的编码.在Python 2中,字符串只是一个字节数组,bytes与Python 3中的类型完全相同.对于一个字符串,s您可以调用s.decode()以获取Unicode字符串,但您必须*手动传递编码,正是出于这个原因.您可以使用a string来保存ASCII字节,或来自Windows代码页850(这是ASCII的超集),或UTF8字节,甚至UTF16字节的字符.最后一种情况很有意思,因为即使该字符串中的字符在ASCII范围内,字节也与ASCII编码的版本不匹配(它们将与空字符交替).该string类型甚至适用于某些二进制格式的字节,这些字节不对应于任何编码字符串,例如图像文件的字节.

更实际的答案是通常使用ASCII.例如,文字字符串"xyz"将给出一个三字节字符串,其字节对应于这些字符的ASCII编码.

这种歧义是Python 3中字符串的行为和约定发生变化的原因.

*正如CristiFati的回答所述,可以省略encoding=参数decode,在这种情况下将采用ASCII.我的错.