Python3 字符串编码混淆输出

标签 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() 之后改变了?

最佳答案

这里涉及到两个不同的概念:

  • 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/

相关文章:

python - Pandas:str 类型的列在使用 apply 函数后转换为 tslib.Timestamp

python - 如何获得对带有噪声的图像进行二维高斯拟合的正确参数

python - 导出到带有目录的 Jupyter 笔记本的 HTML 不会嵌入绘图

python - 回合结束后数值被覆盖,打印时可见

python - 带有 Flask 的 pyCUDA 给出 pycuda._driver.LogicError : cuModuleLoadDataEx

mysql - FIND_IN_SET 用于 Mysql 中的部分字符串

python - Django - 新字体?

javascript - jQuery if div 包含多个文本字符串

python - Peewee 在迁移过程中不使用主键递增整数字段

python - 从另一个字典值分配字典值