Python3字符串编码令人困惑的输出

时间:2018-12-02 08:03:12

标签: python string python-3.x

我正在使用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()之后字节会改变?

1 个答案:

答案 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。