Python - 编写Unicode 字符串
str
Python 的字符串字面量支持"\xNN" 十六进制字节值转义以及"\uNNNN" 和 "\UNNNNNNNN" Unicode 转义。
第一种形式用4位 十六进制数编码2字节(16位) 位字符码点
第二种形式用8位十六进制数编码4字节(32位)码点。
十六进制值0xCD和0xE8,是ASCII 的7位字符范围之外的两个特殊的声调字符,但是我们可以将其嵌入到Python 3.X 的str对象中
,因为str 支持Unicode:
>>> chr(0xc4)
'Ä'
>>> chr(0xe8)
'è'
>>> S = '\xc4\xe8'
>>> S
'Äè'
>>> S = '\u00c4\u00e8'
>>> S
'Äè'
>>> len(S)
2
注意在这样的Unicode 文本字符串字面量中,十六进制转义和Unicode 转义都表示一个Unicode码点值,而不是一个字节值。
十六进制转义x要求恰好两个十六进制数位(用于8位的码点值)。而Unicode 转义的u和U分别要求4个和8个十六进制数位。
想要表示16位和32位这样大的码点值,可以这样写:
>>> S = '\U000000c4\U000000e8'
>>> S
'Äè'
>>>
Python 3.X 允许特殊的字符以十六进制和Unicode 转义的方式编码到str字符串中,但是只能以十六进制转义的方式编码到bytes 字符串。bytes 字面量中Unicode 转义序列默默地被逐字符处理,而不是作为转义对待。bytes 必须被解码位st 字符串,才可以将其打印为非ASCCI字符:
>>> S = 'A\xc4B\xebc'
>>> S
'AÄBëc'
>>> S = 'A\u00c4B\U000000E8C'
>>> S
'AÄBèC'
>>> B = b'A\xc4B\xE8C'
>>> B
b'A\xc4B\xe8C'
>>> B = b'A\u00c4B\U000000E8C'
>>> B
b'A\\u00c4B\\U000000E8C'
>>> B = b'A\xc4B\xE8C'
>>> B
b'A\xc4B\xe8C'
>>> print(B)
b'A\xc4B\xe8C'
>>> B.decode('latin-1')
'AÄBèC'
>>>
其次字节字面量要求字符是ASCCI字符,如果它们的值大于127就进行转义。另以方面,str字符串允许字面量包含源字符集中的任何字符
byte
bytes对象是一个整数序列,其中每个整数都在0 - 255 之间,并且在显示的时候恰好打印为ASCCI字符。它支持序列操作以及str对象上可用的大多数方法, 不支持格式化方法或 % 格式化表达式,并且不能不经过显示转换就将bytes 和 str 类型对象混合和匹配
# str 有 ,bytes 没有
>>> set(dir('abc')) - set(dir(b'abc'))
{'casefold', 'format', 'isdecimal', 'isprintable', 'encode', 'isidentifier', 'isnumeric', 'format_map'}
# bytes 有 ,str没有
>>> set(dir(b'abc')) - set(dir('abc'))
{'hex', 'decode', 'fromhex'}
>>> B = b'spam'
>>> B.find(b'pa')
1
>>> B.replace(b'pa',b'XY')
b'sXYm'
>>> B.split(b'pa')
[b's', b'm']
>>> B
b'spam'
>>> B[0] = 'x'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'bytes' object does not support item assignment
>>>
>>> '%s' % 99
'99'
>>> b'%s' % 99 # 不能使用格式化
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: %b requires a bytes-like object, or an object that implements __bytes__, not 'int'
>>>
除了方法调用外,字符串和序列的全部常见的通用序列操作,在str 和 bytes 上都有效。包括索引、分片、拼接等。对一个bytes对象进行索引会返回一个表示其二进制值的整数 bytes实际上是一个8位二进制位的整数序列。但是为了方便起见,当作为整体显示的时候它可能打印为一个ASCCI编码的字符串。要查看一个给定的字节值,可以使用chr内置函数 来将其转回字符
>>> B
b'spam'
>>> B[0]
115
>>> B[-2]
97
>>> chr(B[-2])
'a'
>>> list(B)
[115, 112, 97, 109]
>>> B[1:],B[:-1]
(b'pam', b'spa')
>>> B + b'lmn'
b'spamlmn'
>>> B * 4
b'spamspamspamspam'
bytearray
范围在0 - 255 之间的整数的一个可变序列,它是bytes 的可变的变体。支持和bytes相同的字符串方法和序列操作,并且支持可列表同样多的可变的原处修改操作
>>> S = 'spam'
>>> C = bytearray(S)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: string argument without an encoding
>>> C = bytearray(S,'latin1')
>>> C
bytearray(b'spam')
>>> B = b'spam'
>>> C = bytearray(B)
>>> C
bytearray(b'spam')
>>> C[0]
115
>>> C[0] = 'X' # 一旦创建,bytesarray对象像bytes 一样也是小整数序列,并且可以像列表一样修改,尽管进行索引赋值时它们需要一个整数而不是一个字符串
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'str' object cannot be interpreted as an integer
>>> C[0] = b'X'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'bytes' object cannot be interpreted as an integer
>>> C[0] = ord('X')
>>> C
bytearray(b'Xpam')
>>> C[1] = b'Y'[0]
>>> C
bytearray(b'XYam')
>>>
扩展:
字节顺序&BOM
https://zhuanlan.zhihu.com/p/400830663
https://www.codenong.com/cs109611468/
https://zhuanlan.zhihu.com/p/27222802
本文来自博客园,作者:chuangzhou,转载请注明原文链接:https://www.cnblogs.com/czzz/p/17520569.html