计算机汉字编码
1. 汉字编码
汉字编码是为了在计算机系统中表示、存储、处理和传输汉字而制定的编码方案。由于汉字数量众多,需要一套复杂的编码体系来满足各种需求。
2. 常见的汉字编码类型
GB2312-80
编码范围和应用:GB2312-80是中国国家标准简体中文字符集,它收录了6763个汉字和682个非汉字字符。主要用于中国大陆地区,在早期的计算机系统、信息处理和电子设备中广泛应用。例如,许多早期的中文文档编辑、数据库存储等都是基于GB2312-80编码。
编码方式:采用双字节编码,每个字节的最高位为1,以区别于ASCII码(ASCII码字节的最高位为0)。它将汉字分为94个区,每个区有94个位,区码和位码组合起来表示一个汉字。例如,“啊”字的区位码是1601,在计算机中存储时需要将区位码转换为机内码(机内码 = 区位码 + A0A0H)。
GBK(汉字内码扩展规范)
编码范围和应用:GBK是对GB2312-80的扩展,它收录了21003个汉字,包括了许多生僻字和繁体字。在很多现代的中文软件、网站等仍然支持GBK编码,尤其是一些需要处理大量汉字且对兼容性有要求的场景。
编码方式:同样是双字节编码,与GB2312-80兼容,即在处理GB2312-80中的汉字时能够保持一致,同时增加了新的汉字编码范围。
Unicode(统一码)
编码范围和应用:Unicode是一种国际标准编码,旨在涵盖世界上所有的字符,包括各种语言的文字、符号等。在现代的跨语言、跨平台的软件和互联网应用中广泛使用,如操作系统(Windows、Linux、macOS等)、网页浏览器、编程语言等都对Unicode有很好的支持。例如,Java、Python等编程语言内部使用Unicode来处理字符。
编码方式:Unicode有多种编码形式,其中UTF-8、UTF-16和UTF-32较为常见。
UTF-8:一种变长编码方式,它可以使用1-4个字节来表示不同的字符。对于ASCII码字符(0-127),UTF-8编码与ASCII码相同,只用1个字节。对于常用汉字,一般使用3个字节来编码。这种编码方式的优点是与ASCII码兼容,并且在存储和传输中比较节省空间,适用于网络传输和文本存储等场景。
UTF-16:主要使用2个字节或4个字节来编码字符。对于大多数常用字符,包括许多汉字,使用2个字节编码。UTF-16在一些操作系统内部和编程语言中用于处理字符,如Windows NT系列操作系统内部的字符处理部分基于UTF-16。
UTF-32:使用4个字节来表示每个字符,是一种定长编码方式。虽然它简单直接,但由于占用空间较大,在实际应用中相对较少使用,除非对字符处理的一致性和简单性有特殊要求的场景。
BIG5(大五码)
编码范围和应用:BIG5是一种繁体中文字符集编码标准,主要用于中国台湾、香港等地区。在早期的繁体中文电子文档、繁体中文软件和网站等有广泛应用。
编码方式:采用双字节编码,编码范围与GB系列编码不同,专门用于表示繁体汉字和一些特殊字符。
3. 汉字编码转换
在不同的编码体系之间常常需要进行转换。例如,在一个同时支持GBK和UTF-8编码的网站中,如果用户输入的是GBK编码的汉字,要在网页上以UTF-8编码显示,就需要进行编码转换。在编程语言中,可以使用相应的函数库来实现转换。在Python中,可以使用codecs库进行编码转换操作;在C++中,可以利用一些第三方库如iconv或者一些操作系统提供的API来实现汉字编码的转换。
重点讲述:UTF-8
1. UTF-8编码的基本原理
UTF-8是一种变长编码方式,它使用1-4个字节来表示Unicode字符。这种编码方式的设计目的是与ASCII码兼容,即ASCII码中的字符(0-127)在UTF-8编码中保持不变,仍然只用1个字节表示,其字节的最高位为0。
2. 不同字节数的UTF-8编码格式
单字节格式(0xxxxxxx):对于ASCII码范围内的字符(U+0000-U+007F),UTF-8编码与ASCII码相同,使用单字节表示,格式为0xxxxxxx,其中xxxxxxx表示字符的ASCII码值。例如,字符'A'(ASCII码值为65,二进制为01000001)在UTF-8中的编码就是01000001。
双字节格式(110xxxxx 10xxxxxx):对于Unicode代码点在U+0080-U+07FF范围内的字符,UTF-8使用双字节编码。第一个字节的格式为110xxxxx,第二个字节的格式为10xxxxxx。将Unicode代码点转换为二进制后,将其最高5位放入第一个字节的低5位(即xxxxx部分),将剩余的低11位拆分成两部分,分别放入第二个字节的低6位(即xxxxxx部分)。
例如,对于字符'欧元符号(€)',其Unicode代码点为U+20AC,转换为二进制是10000010101100。按照双字节格式编码,第一个字节为11000010(将1000001的最高5位10000放入110xxxxx中的xxxxx部分),第二个字节为10101100(将10000010101100的低11位101100放入10xxxxxx中的xxxxxx部分)。
三字节格式(1110xxxx 110xxxxx 10xxxxxx):对于Unicode代码点在U+0800-U+FFFF范围内的字符,UTF-8使用三字节编码。第一个字节的格式为1110xxxx,第二个字节为110xxxxx,第三个字节为10xxxxxx。将Unicode代码点转换为二进制后,将其最高4位放入第一个字节的低4位(即xxxx部分),将接下来的6位放入第二个字节的低6位(即xxxxx部分),将剩余的低10位放入第三个字节的低10位(即xxxxxx部分)。
例如,汉字“你”的Unicode代码点为U+4F60,转换为二进制是100111101100000。按照三字节格式编码,第一个字节为11100100(将10011的最高4位1001放入1110xxxx中的xxxx部分),第二个字节为11011110(将100111101100000的接下来6位111110放入110xxxxx中的xxxxx部分),第三个字节为10110000(将100111101100000的低10位1100000放入10xxxxxx中的xxxxxx部分)。
四字节格式(11110xxx 1110xxxx 110xxxxx 10xxxxxx):对于Unicode代码点在U+10000-U+10FFFF范围内的字符,UTF-8使用四字节编码。第一个字节的格式为11110xxx,第二个字节为1110xxxx,第三个字节为110xxxxx,第四个字节为10xxxxxx。将Unicode代码点转换为二进制后,将其最高3位放入第一个字节的低3位(即xxx部分),将接下来的4位放入第二个字节的低4位(即xxxx部分),再将接下来的6位放入第三个字节的低6位(即xxxxx部分),将剩余的低10位放入第四个字节的低10位(即xxxxxx部分)。