在《 Python的编码与解码初探 》中,对Python的编码知识稍做了一点研究,本文再深入一些,将字符编码以及不同进制的关系梳理一下。

1. ASCII和Unicode编码

先来看看ASCII和Unicode编码的一个例子:

  • 字母 A 用ASCII编码是十进制的 65 ,二进制的 01000001
  • 字符 0 用ASCII编码是十进制的 48 ,二进制的 00110000 ,注意字符 '0' 和整数 0 是不同的;
  • 汉字 已经超出了ASCII编码的范围,用Unicode编码是十进制的 20013 ,二进制的 01001110 00101101

Python使用 chr() 内置函数创建单字符Unicode字符串,该函数采用整数,并返回长度为1的包含相应码位的Unicode字符串。反向操作是内置 ord() 函数,它使用一个字符的Unicode字符串并返回码位值。

>>> ord('A')
>>> ord('0')
>>> ord('中')
20013
>>> chr(65)
>>> chr(48)
>>> chr(20013)

ASCII编码是1个字节,而Unicode编码通常是2个字节,如果把ASCII编码的A用Unicode编码,只需要在前面补0就可以,因此,A的Unicode编码是00000000 01000001
Unicode编码比ASCII编码需要多一倍的存储空间,于是又有了“可变长编码”的UTF-8编码。UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。

字符ASCIIUnicodeUTF-8
A0100000100000000 0100000101000001
-01001110 0010110111100100 10111000 10101101

2. 二进制、八进制、十进制和十六进制之间的转换

上面可以看到,ord()函数获取的是字符的整数表示,为十进制。
当我们把以Unicode表示的str编码为bytes类型时,其输出是十六进制:

>>> '中'.encode('utf-8')
b'\xe4\xb8\xad'

而我们最终需要的是二进制的表达方式,于是这里就需要在不同的进制之间进行转换。

2.1 转十进制

Python使用内置的 int(x, base=10) 函数来进行十进制的转换,第一个参数是数字或字符串,第二个参数是说明该字符串是几进制的数,默认为十进制。

>>> int('0xe4', 16)
>>> int('01000001', 2)
>>> int('17', 8)

2.2 转十六进制

Python使用内置的 hex(x) 函数将十进制的整数转换为以小写0x开头的十六进制字符串。如需要转换二进制或八进制,需要先将其转换为十进制。

>>> hex(228)
'0xe4'
>>> hex(int('01000001', 2))
'0x41'

也可以通过以下方式来格式化十六进制的显示:

>>> '%#x' % 228, '%x' % 228, '%X' % 228
('0xe4', 'e4', 'E4')
>>> format(228, '#x'), format(228, 'x'), format(228, 'X')
>>> f'{228:#x}', f'{228:x}', f'{228:X}'

2.3 转二进制

Python使用内置的 bin(x) 函数将十进制的整数转换为以小写0b开头的二进制字符串。如需要转换八进制或十六进制,需要先将其转换为十进制。

>>> bin(3)
'0b11'
>>> format(3, '#b'), format(3, 'b')
('0b11', '11')
>>> f'{3:#b}', f'{3:b}'

2.4 转八进制

Python使用内置的 oct(x) 函数将十进制的整数转换为以小写0o开头的八进制字符串。如需要转换二进制或十六进制,需要先将其转换为十进制。

>>> oct(8)
'0o10'
>>> '%#o'% 8 , '%o' % 8
('0o10', '10')
>>> format(8, '#o'), format(8, 'o')
('0o10', '10')
>>> f'{8:#o}', f'{8:o}'

3. 二进制填充

当使用二进制来表示字符编码时,我们一般是用填充了0的八位数字(1个字节)来表示。这里可以使用Python的 f-string 来进行格式化:

>>> f"{3:08b}"
'00000011'

其中3是需要转换的数,08是以0来填充满8位,b是要转换为二进制。

对字符串,可以使用下面的方式来进行格式化:

>>> def make_bitseq(s: str) -> str:
...     if not s.isascii():
...             raise ValueError("ASCII only allowed")
...     return ' '.join(f"{ord(i):08b}" for i in s)
>>> make_bitseq("puran")
'01110000 01110101 01110010 01100001 01101110'

4. 输出Unicode字符

通过Unicode列表可知,标准的Unicode编码是U+0417这样的格式,在Python中,是需要改写成\u0417才能正确的识别并输出对应的字符。

>>> '\u0417'
>>> 'U+0417'
'U+0417'

5. Python中的emoji

在Unicode中,还包含emoji的编码,当直接输出其编码时,一般得不到我们想要的内容:

>>> '\u1F600'

在Python中使用emoji有两种方式:

  1. 通过emoji的Unicode编码来输出
  2. 借助emoji库并通过emoji的别名来输出

1. 通过emoji的Unicode编码
在通过
emoji的Unicode编码来输出emoji时,需要对编码进行改造,将编码扩展为8位。比如,👍的Unicode编码为U+1F44D,在输出时需将其改造为\U0001F44D

>>> print('\U0001F44D')

2. 借助emoji库:
emoji 库的安装很简单:pip install emoji --upgrade

>>> import emoji
>>> print(emoji.emojize("Python is :thumbs_up:"))
Python is 👍
>>> print(emoji.demojize("Python is 👍"))
Python is :thumbs_up:

这个列表列出了几乎所有的emoji及其名字:https://www.webfx.com/tools/emoji-cheat-sheet/,在使用时直接参考即可。

  1. Unicode HOWTO 中文翻译
  2. Python字符串和编码
  3. Python 二进制,十进制,十六进制转换
  4. Unicode & Character Encodings in Python: A Painless Guide
  5. Python 每一天 (5.16) - Emoji 🤣
func main () { fmt . Println ( base256 . EncodeToString ([] byte ( "Hello, 世界" ))) //=> :alien_monster::shaved_ice::person_gesturing_OK::candy::person_bowing::seedling::relieved_face::suspension_railway::sweat_droplets::hospital::horse_face::post_office::backhand_index_pointing_left: fmt . Println ( string ( base256 . DecodeString ( ":alien_monster::shaved 什么是Emoji,跟Unicode什么关系,要搞懂emoji为什么要先理解Unicode? 什么是Unicode,跟ASCII什么关系? 大端序小端序是什么概念?哪些机器用大端序,哪些机器用小端序、 什么是编码?什么是码表?Java用的是什么编码? 二 编码字符集和字符编码编码字符集 (Coded Character Set 即 CCS) 编码字符集的概念就是,给现实世界中的字符,对应的映射一个数字。 这种映射,就是编码字符集。 例如 a=1, b=2, c=3。在计算机里面,将1、
GBK,ISO-8859-1,GB2312的本质区别 编码有几种 ,计算机最初是在美国等国家发明的 所以表示字符只有简单的几个字母只要对字母进行编码就好 我们标准码 iso-8859-1 这就是一个标准 但是后来计算机普及了 于是就中国要使用计算机了 但是机器不认得中文,于是就有了国际码。 gbk gb2312都是这类。两个其实一个,一个是标准(发布的代号),一个是简称。后来多了个阿拉伯语、日
众所周知:计算机底层是以二进制数来进行存储计算,而计算机进制:数制是用一组固定的符号和统一的规则来表示数值的方法。 如果是0x开头说明这是一段十六进制数据,如果是0o开头说明这是一段八进制数据 bin() 说明最终的结果是二进制数据,int()说明先要转换为十进制数据 ,“1F606” 是待转化的字符串数据,base = 16 说明待转化的数据是十六进制 base 等于几就说明你想将那种数据转换成为十进制数据
1、python中的数字 数字是python中最常见的元素之一,再python中的控制台可直接输入数字进行计算得到运算结果,python中的控制台也可以作为一个计算器; python中 的数字语言分为整数和浮点数(整数就是无小数部分的数,浮点数就是有小数部分的数),支持基本的四则运算(加、减、乘、除)和一些其他的运算操作; 4 * 5 5.2 / 2 (30+6) * 5 如果要计算两个数的除法,不管分子分母是整数还是浮点数 ,使用 除法 (/)运算符得到的结果都是浮点数; 微信用户和微信公众号都能直接发送或回复相应的QQ表情给对方,微信公众号回复QQ标签的时候,需要回复相应的**表情代码**,这样就能发送相应的表情。这些表情代码被当作文本消息在微信中转义成图标。 QQ表情相应代码如下:...
有时在项目开发的时候会要求加入一些表情,而大多数情况下emoji表情也会加入其中,但一般项目中给我的emoji表情都是一些16进制字符串,例如:0x1f603 如果要将这些16进制字符串显示成表情,还需要进行以下步骤: var code : String? // emoji的code // 1.创建扫描器 let scanner = NSScanner(strin
#整形(int) 浮点型(float) 复数(complex) 字符串(str) 布尔(bool) 列表(list) 元组(tuple) 字典类型(dict) 集合(set) # 整形就是整数。计算机其实只能保存二进制 0和1,为了方便数据的表示,同时计算机也支持八进制十六进制 #二进制 八进制 十六进制 十进制Python里都能表示 a = 98 #默认数字都是十进制的数字。 98 就是十进制的九十八 b = 0b101101101 #以 0 b开头的数字是二进
```python text = "Hello World 😊" has_emoji = any(char in emoji.UNICODE_EMOJI["en"] for char in text) print(has_emoji) # 输出 True 2. 将字符串中的emoji表情转换为文本描述: ```python text = "I am 😊" text_with_description = emoji.demojize(text) print(text_with_description) # 输出 "I am :smiling_face_with_smiling_eyes:" 3. 将文本描述转换为对应的emoji表情: ```python text = "I am :smiling_face_with_smiling_eyes:" text_with_emoji = emoji.emojize(text) print(text_with_emoji) # 输出 "I am 😊" 这些是`emoji`库的一些基本使用方法,你可以根据自己的需求进行进一步探索和应用。 puran1218: 以上代码只在终端运行通过。今天尝试运行Python脚本来读取hdf5文件时,会报错,一个解决方案是使用绝对路径,正在寻找更好的解决方案。 [code=plain] OSError: Unable to open file (unable to open file: name = 'datasets/train_catvnoncat.h5', errno = 2, error message = 'No such file or directory', flags = 0, o_flags = 0) [/code] ArcGIS Earth 桌面端1.10与移动端1.1重磅发布 puran1218 putaside: 是的,团队也在解决如何上架国内安卓市场的问题。//没有市场作为审核,单独分发apk的话可能会存在一些不可知的安全风险~ ArcGIS Earth 桌面端1.10与移动端1.1重磅发布 putaside: 国内访问不了google play