我正在使用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))
----list2字节------
194
80
----字符串字节------
195
130
80
----字符串------
194
80
为什么在string.encode((之后字节会发生变化?
这里涉及两个不同的概念:
chr()
函数将在指定的Unicode Code Point
处为您提供character
。你可以在这里查找代码点194,它是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,所以它只是添加的。强制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