python encode ascii_python中,为何输入print(“a”.encode(“ASCii”))出来显示的是b‘a’?...

来看看文档str.encode(encoding="utf-8",errors="strict")

返回原字符串编码为字节串对象的版本。

b'a'这种形式就是字节串,而不是你想要的二进制串。

那么怎么才能得到一个字符的二进制表示呢?分两步,第一步,先得到这个字符的ascii码值,将其表示为整数;第二步,将这个整数打印成二进制字符串。

这两步刚好都有内置函数ord()bin()ord(c)

对表示单个 Unicode 字符的字符串,返回代表它 Unicode 码点的整数。

bin(x)

将一个整数转变为一个前缀为“0b”的二进制字符串。

所以:

>>> ord('a')

97

>>> bin(ord('a'))

'0b1100001'

>>> hex(ord('a'))

'0x61'

回答你在评论里的问题:为什么输入数字或者英语encode返回的是它本身,但是中文日文什么的就会返还一些字母+数字?

涉及到unicode字符的时候,情况要复杂的多。

这涉及到utf-8编码的问题。utf-8编码使用1、2、3或者4字节来编码一个字符,可以兼容ascii(一个字节),也就是ascii是utf-8的子集。而中文日文需要多于一个字节来表示。

这里需要理解unicode codepoint和utf-8编码的区别。可以参考网上的文章:一次性搞清楚unicode、codepoint、代码点、UTF​www.jianshu.com字符编码笔记:ASCII,Unicode 和 UTF-8​www.ruanyifeng.com

这里,你会发现ord()和encode()得到的结果并不相同。

比如“中”这个字:

>>> ord('中')

20013

>>> hex(ord('中'))

'0x4e2d'

>>> '中'.encode()

b'\xe4\xb8\xad'

ord得到的是Unicode codepoint(这里的值是0x4e2d这两字节)范围是0x0000到0xFFFF,称为UCS-2编码。utf-8编码在这里却是三字节0xe4b8ad。

如果你知道codepoint,是可以用其具体编码来表示一个字符的;通过utf-8的字节串,也可以用decode()得到具体字符:

>>> '\u4e2d'

'中'

>>> b'\xe4\xb8\xad'.decode()

'中'

其中\u表示unicode编码,\x表示16进制数。

也就是说,对于ascii编码,通常很多编码都是相同的。但是涉及到中文、日文、emoji等,往往需要多个字节来表示,这个时候取决于具体编码标准会有不同,比如GBK、GB2312、UTF-8、UTF-16等等。

(不知道你是否了解数字的16进制表示,就是用0123456789abcdef 这16个字符来表示数字,这样,2个字符表示1个字节。上面假设你了解16进制表示数;如果不了解,可以稍微搜索一下。)

希望能解答你的疑问。

参考

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值