我用的是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() 之后改变了?
最佳答案
这里涉及到两个不同的概念:
chr()
函数将为您提供位于指定Unicode Code Point
处的字符
.您可以查找代码点 194 here ,它是带有 CIRCUMFLEX 的拉丁文大写字母 A
(这并不奇怪)。- 向字符串中添加一个字符会向该字符串添加该字符,而不是原始字节。取回字节涉及编码。
- 当您对字符串调用
.encode()
时,您会得到它的UTF-8
编码的字节。这不仅仅是代码点的串联。 字符
的 UTF-8 编码有两个字节,因为它的 Ucode-value 大于 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。
关于Python3 字符串编码混淆输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53578472/