首页 > 编程笔记 > Python笔记

Python字符串编码格式有哪些

世界上存在多种自然语言,这意味着 Python 程序代码中可能存在若干种语言文字的标识符和字符串用于显示、输出或注释。为了存储和显示这些不同的语言文字,不同的国家和组织制定了若干种字符集标准。常见的字符集有 ASCII 字符集、简体中文 GB2312 字符集、繁体中文 Big5 字符集、简体中文 GB18030 字符集、Unicode 字符集等。

ASCII字符集

ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是由美国国家标准学会(American National Standard Institute,ANSI)制定的基于拉丁字母的一套电脑编码系统,起始于 20 世纪 50 年代后期,在 1967 年定案,主要用于显示现代英语和其他西欧语言。ASCII 字符集是现今最通用的单字节编码系统,等同于国际标准 ISO/IEC 646。

ASCII 码使用指定的 7 位或 8 位二进制数组合来表示 128 或 256 种可能的字符。标准 ASCII 码也叫基础 ASCII 码,使用 7 位二进制数(剩下的 1 位二进制为 0)来表示所有的大写和小写字母、数字 0 到 9、标点符号,以及在美式英语中使用的特殊控制字符。其中:

1) 0~31 及 127(共 33 个)是控制字符或通信专用字符(其余为可显示字符),如控制符:LF(换行)、CR(回车)、FF(换页)、DEL(删除)、BS (退格)、BEL(响铃)等;通信专用字符:SOH(文头)、EOT(文尾)、ACK(确认)等;ASCII 值为 8、9、10 和 13 分别转换为退格、制表、换行和回车字符。它们并没有特定的图形显示,但会依据不同的应用程序,而对文本显示有不同的影响。

2) 32~126(共 95 个)是字符(32 是空格),其中 48~57 为 0 到 9 十个阿拉伯数字。

3) 65~90 为 26 个大写英文字母,97~122 为 26 个小写英文字母,其余为一些标点符号、运算符号等。

4) 在标准 ASCII 码中,最高位(b7)用作奇偶校验位。奇偶校验,是指在代码传送过程中用来检验是否出现错误的一种方法,一般分奇校验和偶校验两种。奇校验规定:正确的代码一个字节中1的个数必须是奇数,若非奇数,则在最高位(b7)加 1;偶校验规定:正确的代码一个字节中 1 的个数必须是偶数,若非偶数,则在最高位(b7)加 1。

5) 在标准 ASCII 码中,最高位(b7)用作奇偶校验位。奇偶校验,是指在代码传送过程中用来检验是否出现错误的一种方法,一般分奇校验和偶校验两种。奇校验规定:正确的代码一个字节中1的个数必须是奇数,若非奇数,则在最高位(b7)加 1;偶校验规定:正确的代码一个字节中1的个数必须是偶数,若非偶数,则在最高位(b7)加 1。

6) 后 128 个称为扩展 ASCII 码。许多基于 x86 的系统都支持使用扩展(或“高”)ASCII。扩展 ASCII 码允许将每个字符的第 8 位用于确定附加的 128 个特殊符号字符、外来语字母和图形符号。

需要注意的是,数字的 ASCII 码<大写字母的 ASCII 码<小写字母的 ASCII 码。

GB2312和GB18030字符集

GB2312 和 GB18030 字符集是由中国制定的汉字编码字符集,GB 代表国标,2312 和 18030 分别表示标准编号。

GB2312 的中文名称是《信息交换用汉字编码字符集》,它是由中国国家标准总局在 1980 年发布并于 1981 年 5 月 1 日开始实施的一套国家标准,标准号是 GB2312—1980。GB2312 编码适用于汉字处理、汉字通信等系统之间的信息交换,通行于中国大陆,中国大陆几乎所有的中文系统和国际化的软件都支持 GB2312。

GB2312 基本集共收入汉字 6763 个(其中一级汉字 3755 个,二级汉字 3008 个),非汉字图形字符 682 个。整个 GB2312 字符集分成 94 个区,每区有 94 个位,每个区位上只有一个字符,因此可用所在的区和位来对汉字进行编码,称为区位码。把换算成十六进制的区位码加上 2020H,就得到国标码,把国标码加上 8080H,就得到了常用的计算机机内码。

1995 年中国国家标准总局又颁布了《汉字编码扩展规范》(GBK)。GBK 与 GB2312—1980 国家标准所对应的内码标准兼容,同时在字汇一级支持 ISO/IEC10646—1 和 GB13000—1 的全部中、日、韩(CJK)汉字,共计 20902 个字。

GB18030 的中文名称是《信息技术中文编码字符集》,是我国继 GB2312—1980和GB13000.1—1993 之后最重要的汉字编码标准,是我国计算机系统必须遵循的基础性标准之一。GB18030 有两个版本:GB18030—2000 和 GB18030—2005。GB18030—2000 是 GBK 的取代版本,它的主要特点是在 GBK 基础上增加了 CJK 统一汉字扩充 A 的汉字。GB18030—2005 的主要特点是在 GB18030—2000 基础上增加了 CJK 统一汉字扩充 B 的汉字。

Big5字符集

Big5 码,又称为大五码,是繁体中文社区中最常用的电脑汉字字符集标准,共收录 13060 个汉字。倚天中文系统、Windows 繁体中文版等主要系统的字符集都是以Big5为基准的,但厂商又各自增加了不同的造字与造字区,派生出多种不同版本。2003 年,Big5 被收录到 CNS11643 中文标准交换码的附录当中,获取了较正式的地位,这个最新版本称为 Big5—2003。

Big5 码,又称为大五码,是繁体中文社区中最常用的电脑汉字字符集标准,共收录 13060 个汉字。倚天中文系统、Windows 繁体中文版等主要系统的字符集都是以 Big5 为基准的,但厂商又各自增加了不同的造字与造字区,派生出多种不同版本。2003 年,Big5 被收录到 CNS11643 中文标准交换码的附录当中,获取了较正式的地位,这个最新版本称为 Big5—2003。

Big5 码是一套双字节字符集,使用了双八码存储方法,以两个字节来存放一个字。第一个字节称为“高位字节”,第二个字节称为“低位字节”。“高位字节”使用了 0x81-0xFE,“低位字节”使用了 0x40-0x7E 及 0xA1-0xFE。

因为低比特字符包含了编程语言中字符串或命令常会用到的特殊字符,例如 0x5C“\”、0x7C“|”等。“\”在许多用途的字符串中当作转义符号(转义字符),例如 \n(换行)、\r(归位)、\t(tab)、\\(\本身符号)、\"(引号)等。而“|”在 UNIX 操作系统中大多当作命令管线使用,如“ls-la|more”等。如果在字符串中有这些特殊的转义字符,那么它们会被程序或解释器解释为特殊用途。但是因为是中文,故无法正确解释为上面所述的行为,因此程序可能会忽略此转义符号或是中断运行。

Unicode字符集

Unicode 是计算机科学领域里的一项业界标准,包括字符集、编码方案等。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。Unicode 于 1990 年开始研发,在 1994 年正式发布。

Unicode 通常用两个字节表示一个字符,原有的英文编码从单字节变成双字节,只需要把高字节全部填为 0 即可。因为 Python 的诞生比 Unicode 标准发布的时间还要早,所以最早的 Python 只支持 ASCII 编码,普通的字符串 ABC 在 Python 内部都是使用 ASCII 编码的。

在表示一个 Unicode 的字符时,通常会用“U+”然后紧接着一组十六进制的数字来表示这一个字符。在基本多文种平面(英文为 Basic Multilingual Plane,简写为 BMP,它又简称为零号平面,plane 0)里的所有字符,要用四位十六进制数(例如 U+4AE0,共支持六万多个字符),在零号平面以外的字符则需要使用五位或六位十六进制数了。旧版的 Unicode 标准使用相近的标记方法,但却有些差异:在 Unicode 3.0 中使用“U-”然后紧接着八位数,而“U+”则必须随后紧接着四位数。

在 Unicode 中有很多方式将数字 23383 表示成程序中的数据,包括 UTF-8、UTF-16、UTF-32。UTF 是 Unicode Transformation Format 的缩写,可以翻译成 Unicode 字符集转换格式,即怎样将 Unicode 定义的数字转换成程序数据。

例如,“汉字”对应的数字是 0x6c49 和 0x5b57,而编码的程序数据是:

Char  data_utf8[]={0xE6f, 0xB2, 0x94, 0xE5, OxAD, 0x97 };   //UTF-8 编码
char16_t  data_utf16[]={0x6C49, 0x5B57};   //UTF-16编码
char32_t data_utf32[]={0x00006C49,0x00005B57};  //UTF-32编码


这里用 char、char16_t、char32_t 分别表示无符号 8 位整数,无符号 16 位整数和无符号 32 位整数。UTF-8、UTF-16、UTF-32 分别以 char、char16_t、char32_t 作为编码单位。根据字节序的不同,UTF-16 可以被实现为 UTF-16LE 或 UTF-16BE,UTF-32 可以被实现为 UTF-32LE 或 UTF-32BE。

所有教程

优秀文章