字符串编码中的 Python-3 和 \x Vs \u Vs \U 以及为啥
Posted
技术标签:
【中文标题】字符串编码中的 Python-3 和 \\x Vs \\u Vs \\U 以及为啥【英文标题】:Python-3 and \x Vs \u Vs \U in string encoding and why字符串编码中的 Python-3 和 \x Vs \u Vs \U 以及为什么 【发布时间】:2018-02-18 08:24:45 【问题描述】:为什么我们在 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】:Python 为您提供了字符串的表示形式,对于不可打印的字符,将使用最短的可用转义序列。
\x80
与\u0080
或\U00000080
的字符相同,但\x80
更短。对于chr(57344)
,最短的符号是\ue000
,不能用\xhh
表示同一个字符,该符号只能用于\0xFF
以下的字符。
对于某些字符,甚至可以使用单字母转义,例如 \n
用于换行,\t
用于制表符。
出于历史和实际原因,Python 有多种表示法选项。在 字节字符串 中,您只能创建 0 - 255 范围内的字节,因此 \xhh
比在您甚至无法使用完整的任何地方都必须使用 \U000hhhhh
更有用且更简洁范围可用于该表示法,并且\xhh
和\n
以及相关代码对于其他语言的程序员来说是熟悉的。
【讨论】:
这里的逻辑不是\U0010ffff'
,而是应该像\U10ffff' or
\u10ffff'
@MaNKuR:不,因为\U
语法是固定宽度。它需要 8 个十六进制字符;并且\u
语法需要 4。如果它们使用可变数量的十六进制字符,则您不能在这些字符后面加上恰好具有十六进制含义但不属于转义序列的其他 ascii 字母或数字。
@MaNKuR: \U
是 8 个十六进制字符,因为 Unicode 标准可以扩展为需要所有这些数字。仅仅因为今天的最大代码点是 \U0010FFFF
并不意味着未来对 Unicode 标准的更新永远不会达到 \UFFFFFFFF
。
我还是很困惑,\u00a3
和 \xa3
对于符号 £
是一样的。但是\ua3
不行吗?
@mingchau: \ua3
不能工作,因为这不是一个有效的\uhhhh
转义序列,Python 根本不接受较短的形式。那是因为接受较短的转义会让人很困惑,文本'Hello \ua3darling'
是否包含转义序列\ua
、\ua3
、\ua3d
或\ua3da
?以上是关于字符串编码中的 Python-3 和 \x Vs \u Vs \U 以及为啥的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Python 3.2 或更高版本中使用“十六进制”编码?
VS2010与VS2013中的多字节编码与Unicode编码问题
Python 3字典迭代中的性能:dict [key] vs. dict.items()