我正在使用python3,但我不知道这里发生了什么:
x=[0xc2,0x50]
print('----list2bytes------')
for i in bytes(x):
print(i)
s=''
for i in x:
s+=chr(i)
print('----string2bytes----')
for i in s.encode():
print(i)
print('----string2ord------')
for i in s:
print(ord(i))
---- list2bytes ------
194
80
---- string2bytes ----
195
130
80
---- string2ord ------
194
80
为什么string.encode()之后字节会改变?
答案 0 :(得分:2)
这里涉及两个不同的概念:
chr()
函数将在指定的Unicode Code Point
处为您提供character
。您可以查找代码点194 here,它是LATIN CAPITAL LETTER A WITH CIRCUMFLEX
(没有任何惊喜)。.encode()
时,您会得到UTF-8
编码的字节。这不仅仅是代码点的串联。字符Â
的UTF-8编码有两个字节,因为它的Ucode值大于128。第一个字节为192 + (Ucode-value div 64)
== 192 + (194 div 64)
,其中再次是194
== 0xc2
(增加了困惑)。第二个字节是128 + (Ucode-value div 64)
== 128 + (194 % 64)
== 0x82
。
因此,字符Â
在UTF-8中编码为0xc2, 0x82
。
第二个字符的(P
)Ucode值小于128,因此已将其添加。 Thereforce 0xc2, 0x82, 0x50
== 194, 130, 80
是编码为UTF-8的整个字符串。
完全巧合的是,代码点序列194, 80
在UTF-8中编码为194, 130, 80
,给人的感觉是130
只是插入了。
ord()
将再次为每个字符提供Unicode代码点。字符LATIN CAPITAL LETTER A WITH CIRCUMFLEX
的Unicode代码点的整数表示是194。