Skip to content
0

编码

ASCII

ASCII 码一共规定了128个字符的编码,最前面一位统一为0。

python
s = '\x56'  
print(s) # 'V'

int('0x56', 16)  # 86  int后面的16表示此数字字符串是16进制
chr(86)  # 'V'
ord('V')  # 86

Unicode

ACSII是单字节的,只能表示以英文字母为主的国家,但全世界有很多种不同的语言,需要使用多个字节来表示,称之为宽字节。Unicode就是广泛使用的宽字节的一种编码方式:包含所有国家的符号集,它只规定了符号的二进制代码,但没有规定这个二进制代码应该如何存储。

中文基本汉字范围: [\u4E00-\u9FA5]

python
# Python本身就是使用unicode编码,所以打印可以直接显示出来。
s = '\u4e00'  # '一'
s = '\u4e01'  # '丁'
print(s)

# python有时会对字符串中的'\'进行转义
s = '\\u4e00'
s.encode().decode('unicode_escape') 

# 输出unicode码
text = "我爱你"
text.encode("unicode_escape")

# 注意:\u 和 \U 有所区别
# \u表示2字节, \U表示4字节
re.compile(r"[\U0001f300-\U0001f6ff]")

本国编码

只限于自己国内使用的编码,如中国的 GBK 和 GB2312。在 GBK 编码中,中文汉字占2个字节。

UTF-8

utf-8是Unicode的实现方式之一,是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。编码规则如下:

  • 对于单字节的符号,字节的第一位设为0,后面7位为这个符号的 Unicode 码。因此对于英语字母,UTF-8 编码和 ASCII 码是相同的。
  • 对于n字节的符号(n > 1),第一个字节的前n位都设为1,第n + 1位设为0,后面所有字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的 Unicode 码。

UTF8 BOM 是以(EF BB BF)字节开头的文本流。它能够让读者更可靠的识别文件是否以UTF-8编码的。通常,BOM用于表示编码的字节顺序, 但是由于字节顺序与UTF-8无关,因此BOM不是必须的。

英文字母系列用1个字节表示,汉字用3个字节表示 。

汉字:我 \u6211
bin(int("6211", 16))
'0b110001000010001'

utf8:    11100110 10001000 10010001  # 开头有3个1,表示3字节的utf-8编码
utf8-3:  1110xxxx 10xxxxxx 10xxxxxx
unicode:     0110   001000   010001

根据Unicode标准,不建议使用UTF-8文件的BOM。

常见问题:从网上下载的excel或者其他文档,csv文件,使用Microsoft Excel打开乱码?

可以尝试将文档转换为UTF-8 BOM 格式。

ANSI

英文编码同ASCII,即0x00~0x7F

0x0080~0xFFFF为扩展码,不同的国家制定了不同的标准,如简体中文为GB2312

base64

网络上最常见的用于传输8Bit的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。编码规则:

每3个字节一组,一共是3x8=24bit,划为4组,每组正好6个bit,对6位查表可得编码后的字符串,要编码的二进制数据不是3的倍数时,Base64用\x00字节在末尾补足后,再在编码的末尾加上1个或2个=号,表示补了多少字节,解码的时候,会自动去掉。

由于标准的Base64编码后可能出现字符+/,所以对不同应用场景有不同编码方式:

如对于URL,有一种"url safe"的base64编码,其实就是把字符+/分别变成-_

如对于正则,将“+”和“/”改成了“!”和“-”。

全角和半角

中文文字永远是全角,只有英文字母、数字键、符号键才有全角半角的概念。

  1. 全角空格为12288,半角空格为32。
  2. 其他字符半角(33-126)与全角(65281-65374)的对应关系是:均相差65248(0xfee0)。