为了账号安全,请及时绑定邮箱和手机立即绑定

与编码和解码混淆

与编码和解码混淆

翻过高山走不出你 2022-09-27 10:03:08
因此,我想通过编写字母的十六进制值来打印希伯来语(或任何其他语言),对其进行解码并将其打印到终端。这就是我尝试的,我从 https://en.wikipedia.org/wiki/Code_page_862 获得了cp862的代码页,并试图打印第一个字母。它输出其他内容,而不是想要的结果。我做错了什么?letter = b'\x05\xD0' print(letter.decode('cp862'))输出:wahalez@wahalez:~/开发/蟒蛇$ 蟒蛇 p25.py╨何时使用编码,何时使用解码?编辑:另一个奇怪的行为是我交换了字节并将其解码为utf-16,它工作了。为什么?。。letter2 = b'\xD0\x05' print(letter2.decode('utf-16'))
查看完整描述

3 回答

?
慕姐4208626

TA贡献1852条经验 获得超7个赞

你误读了那张图表。该值是该字符的 unicode 代码点。该值是 CP862 值(请参阅右侧和顶部的?)。所以如果你要写:0x05D00x808__0


>>> letter = b'\x80'

>>> print(letter.decode('cp862'))

א

你会得到你想要的。


我怎么能使用统一码来代替?用什么编码?


我不完全清楚你想做什么。如果您只想使用表格中的字符,只需复制并粘贴即可。例如:


letter = 'א`

没有必要纠结编码或解码。


如果要从特定的 unicode 代码点生成字符,只需使用以下函数:chr


>>> print(chr(0x05d0))

א


查看完整回答
反对 回复 2022-09-27
?
HUX布斯

TA贡献1876条经验 获得超6个赞

  • 在python字符串中,字节和字节序列称为平面序列,这意味着它们已编入索引,但它们与容器化序列(如列表或元组)的类型不同,

  • 任何字符串字符都有一个称为代码点的固定标识。码位是介于 0 和 0 到 1,114,111 之间的小数。

  • 内置函数采用单个字符并返回一个整数,该整数表示字符的代码点ord()

print([chr(i) for i in range(100,120)])

['d', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w']

ord('€')

8364

代码点的格式为 U+ 前缀

对于字母 A,代码点是 U+0041,对于欧元符号,代码点是 U+20AC

如果我们用他包装,我们得到字符的十六进制表示ord()hex()

hex(ord('A'))

'0x41'

hex(ord('€'))

'0x20ac'

现在,如果你从机器的角度来考虑这个问题,想想所有这些都是用机器语言写的。所以你用机器语言把它变成你(用户)可读的格式。decode()

b'\x41'.decode('UTF_8')

'A'

b'\x41\x00'.decode('UTF_16')

'A'

b'\x41' 和 b'\x41\x00' 是 utf-8 和 utf-16 编码中字母 A 的字节序列

b'\xe2\x82\xac'.decode('UTF_8')

'€'

b'\xac\x20'.decode('UTF_16')

'€'

当您编码时,您将字节序列转换回机器理解的语言。

字节序列是机器识别的码位表示形式

.encode() 字符串到字节,.decode() 字节到字符串

字符串字符和字节之间的映射使用 UTF-8(或 UTF-16,gb2312...)编码进行解释

"café".encode('utf_8')

b'caf\xc3\xa9'

"café".encode('utf_16')

b'\xff\xfec\x00a\x00f\x00\xe9\x00'

'El Niño'.encode('utf_8')

b'El Ni\xc3\xb1o'

因此,当实例对象是希伯来语或字符时使用,当您的实例是字节序列(例如字母 A 的字节序列)时使用。.encode().decode()b'\x41\x00'

在非常相似的行为中,class 方法采用字符并对其进行编码,就像编码到字节序列中一样。bytes().encode()

bytes("El Niño", encoding = 'utf_16')

b'\xff\xfeE\x00l\x00 \x00N\x00i\x00\xf1\x00o\x00'

上面的所有代码都在python3.8中。在python 2中,在数据类型方面有所不同。因此,如果您在Python 2中尝试此操作,请谨慎行事


查看完整回答
反对 回复 2022-09-27
?
catspeake

TA贡献1111条经验 获得超0个赞

    

有一个方便的缩写;BADTIE:字节被解码,文本被编码。


此外,您还混淆了 Unicode 代码点与值。cp862


希伯来字母Aleph是Unicode代码点0x05D0,但在代码页862中,它是0x80。


试试这个:


In [3]: b = b'\x80'

Out[3]: b'\x80'


In [4]: b.decode('cp862')

Out[4]: 'א'

To use the unicode code point, try:


In [12]: chr(0x05D0)

Out[12]: 'א'


查看完整回答
反对 回复 2022-09-27
  • 3 回答
  • 0 关注
  • 141 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号