python3如何使用chr()把一个大于128数字转为ascii的bytes类型:报错 -问答-阿里云开发者社区-阿里云

开发者社区> kun坤> 正文

python3如何使用chr()把一个大于128数字转为ascii的bytes类型:报错

2020-06-14 10:30:36 524 1

在 num<128的时候,使用chr(num).encode('utf-8')得到的是一个字符的ascii十六进制

但是在num>128的时候,使用chr(num).encode('utf-8')得到的是两个字节的ascii十六进制,请问该如何转换,我能够得到一个字节的十六进制??

取消 提交回答
全部回答(1)
  • kun坤
    2020-06-14 10:30:40

    这是一个很有意思的问题,让我来从头讲起。

    首先,我们看看help(chr),可以知道Return a Unicode string of one character with ordinal i; 0 <= i <= 0x10ffff. 所以chr(i)函数实际上返回的是Unicode编码表中的一个字符,参数i指定了这个字符在Unicdoe编码表中的位置。

    PS1:Unicode编码表是一个全球统一的标准,我们可以认为它为世界上所有的字符(还有一些glyph、表情之类的)都编了号。而其他一些编码,比如ASCII、GBK、cp1252等编码,则只编码了Unicode编码表中的一部分字符。当然还有utf-8和uft-16等编码则是采用不同的方式编码了所有的Unicode字符。目前Unicode已经发布到了第9版,Python 3内部采用Unicode表示所有字符,即str类型,而编码成其他编码格式后,则是Bytes类型。

    ASCII编码中每个字符编码是1个Byte,且只有0-127,而128-255部分的编码属于Extended ASCII。Python默认的ASCII中是没有大于127部分的,如果执行:chr(128).encode('ascii'),会得到异常'ascii' codec can't encode character '\x80' in position 0: ordinal not in range(128)

    而utf-8编码虽然支持所有的Unicode字符,但根据字符的不同,会采用1~3个Byte来编码字符。它对于ASCII编码是兼容的,所以0~127的部分和utf-8和ascii的编码是一样的。但是大于128的那部分extended ascii中的字符,则采用了两个字节进行编码,这也是为什么你的代码得到了两个Bytes。

    我猜你需要的是一个支持Extended ASCII部分字符,且采用1个Byte固定大小编码的encoding,比如ISO 8859-1,也被称为latin1。

    举个例子,比如人民币钱多符号¥在Unicode中的位置是165。

    >>> chr(165)
    ¥
    >>> chr(165).encode('latin1')
    b'\xa5'

    其他的编码比如cp437、cp1252,也可以编码128-255中的部分字符,比如 chr(165).encode('cp437')返回b'\x9d',比如 chr(165).encode('cp1252')返回b'\xa5'。但如果编码chr(128)就会报错。所以,如果你的目的是要能支持chr(i),0 <= i <= 255,那么我还是推荐你用latin1。

    PS2:关于这个问题,《Fluent Python》的第4章值得一读,讲得非常清楚。

    参考资料:

    * 《Fluent Python》, Chapter 4
    * http://www.ascii-code.com/
    * https://en.wikibooks.org/wiki/Unicode/Character_reference/0000-0FFF
    * https://en.wikipedia.org/wiki/Extended_ASCII#ISO_8859_and_proprietary_adaptations
    * https://docs.python.org/3.5/library/unicodedata.html######感谢!解决了我的问题!######对对对。就是这个样子。我看了看utf-8会编成两个字节,但是我不知道还有那些编码可用。谢谢你了。哥们######

    使用chr()得到的是ASCII的字符,比如十进制的33,使用chr('33')得到的是一个感叹号[!],确认一下是不是你的需求。

    如果只是为了得到16进制,可以使用hex(num).split("0x").zfill(8)

    ######谢谢哥们。楼下那哥们给我说清楚了谢谢######回复 @亲情的三分 : 其实还不是很明白你的意图。或者说你的需求是什么。 能否这么说,假如: 现在的字符串:'123' 想转换后的字符串: ????######您帮我再看看我的补充?谢谢######

    用encode()方法并不会得到十六进制串,它只会得到转码好的bytes类型,把整数转成十六进制应该这样:'%.2X' % num


    0 0
相关问答

3

回答

专有云升级aliyun-python-sdk-core后报错。而location-readonly.aliyuncs.com域名可以通过curl访问。

萌萌怪兽 2018-10-15 20:46:31 51480浏览量 回答数 3

6

回答

osscmd,一条命令上传和下载的python工具

wood23 2012-06-30 12:08:18 39855浏览量 回答数 6

5

回答

设置跨域资源共享CORS并使用JS表单PostObject直接上传到OSS

wood23 2015-02-12 08:11:09 40593浏览量 回答数 5

22

回答

爬虫数据管理【问答合集】

我是管理员 2018-08-10 16:37:41 146742浏览量 回答数 22

41

回答

OSS FTP工具发布啦

oss-dev 2015-12-23 16:58:56 65993浏览量 回答数 41

41

回答

【精品问答集锦】Python热门问题

小六码奴 2019-05-30 15:27:34 135456浏览量 回答数 41

249

回答

阿里云LNAMP(Linux + Nginx + Apache + MySQL + PHP)环境一键安装脚本

云代维 2014-02-14 15:26:06 302559浏览量 回答数 249

24

回答

【精品问答】python技术1000问(1)

问问小秘 2019-11-15 13:25:00 471189浏览量 回答数 24

30

回答

基础语言百问-Python

薯条酱 2017-05-17 18:01:13 64725浏览量 回答数 30

21

回答

OSS新手视频教程!

聚小编 2013-01-14 18:09:51 57974浏览量 回答数 21
+关注
0
文章
13401
问答
问答排行榜
最热
最新
推荐问答
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载