Python-3中字符串编码的\x、\u和\U有什么区别?为什么会有这些差异?

20

为什么Python 3中有不同的字节向字符串表示形式?使用单个表示形式而不是多个表示形式是否已经足够了呢?

对于ASCII范围内的数字打印,字符串显示以\x开头的序列:

 In [56]: chr(128)
 Out[56]: '\x80'

在另一种数字范围中,Python使用以\u开头的序列。

In [57]: chr(57344)
Out[57]: '\ue000'

但是在最高范围的数字,即截至目前的最大Unicode数值,它使用前导\U

In [58]: chr(1114111)
Out[58]: '\U0010ffff'
1个回答

22
Python会为字符串提供一个表示,并对于不可打印的字符使用最短的可用转义序列。例如,\x80与\u0080或\U00000080是相同的字符,但\x80更短。对于chr(57344),最短的符号是\ue000,你不能使用\xhh表示相同的字符,因为该符号只能用于\0xFF以下的字符。
对于某些字符,甚至有单字母符号,如\n表示换行,\t表示制表符。
由于历史和实际原因,Python具有多种符号选项。在字节串中,您只能创建0-255范围内的字节,所以在无法使用该符号的全范围时,\xhh比到处都要使用\U000hhhhh更简洁且更有帮助,而\xhh和\n等相关符号对于其他语言的程序员来说是熟悉的。

1
@MaNKuR:不是因为\U语法是固定宽度吗?它需要8个十六进制字符;而\u语法只需要4个。如果它们采用可变数量的十六进制字符,那么你就不能在其后跟随其他ASCII字母或数字,这些字母或数字恰好具有十六进制意义,但不是转义序列的一部分。 - Martijn Pieters
2
@MaNKuR:\U是8个十六进制字符,因为Unicode标准可能会扩展到需要所有这些数字。仅因今天的最大码点是\U0010FFFF并不意味着未来的Unicode标准更新永远不会达到\UFFFFFFFF - Martijn Pieters
1
我还是困惑,\u00a3\xa3对于符号£来说是相同的。但是\ua3不能工作吗? - mingchau
4
@mingchau说\ua3无法工作,因为它不是有效的\uhhhh转义序列,Python不接受更短的形式。这是因为接受更短的转义会非常令人困惑,比如文本'Hello \ua3darling'中包含了转义序列\ua\ua3\ua3d还是\ua3da - Martijn Pieters
如果一个字符串混合了所有这些,会怎样? - Vishal Kumar Sahu
显示剩余4条评论

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