Python3字符串编码混乱的输出



我正在使用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

最新更新