字符集与字符编码
主要是总结,资料来源是网络,底部会把链接挂上。
一、名词解释
- 字符集 :字符编码就是一个系统支持的所有抽象字符的集合,字符是各种文字和符号的总称。
- 字符编码 :将符号转换为计算机可以接受的数字系统的规则,是符号集合与数字系统之间建立对应关系,它是信息处理的一项基本技术。
- 编码 :按照某种字符编码将字符存储在计算机中
- 解码 :将存储在计算机中的二进制数解析出来
二、编码集
- ASCII 美国最早推出,由一个字节表示,共128个,编码范围是0-127
- ISO 由西欧国家对ASCII的扩展,增加到256个字符,ISO8859
- GB2312 中国推出,完整保留ASCII,兼容约7000简体字、数学符号、罗马希腊字母、日本假名等。小于127的字符与ASCII对应,两个大于127的结合起来表示一个汉字。高位在0xA1到0xF7,低位在0xA1到0xFE,其中更包括ASCII就有的字符,但是这里为“全角”,小于127的称为“半角”。该编码称为GB2312 。
- GBK 当时GB2312这并没有包括完整的中文,简体都没包括完整,繁体就更别说了。在这个前提下出现GBK 编码,把低位的0xA1不从0开始,这里就将繁体等字符加进来了,范围为0x8140至0xFEFE。向下与 GB 2312 编码兼容,向上支持 ISO,与 Unicode 组织的 Unicode 编码完全兼容。GB13000等同于ISO10646
- GB18030 兼容GB2312,基本兼容GBK,支持GB13000及Unicode的全部统一汉字。编码与utf8相同,采用可变长度的编码,GB18030-2000为强制要求支持的版本,GB18030-2005为增加多种少数民族文字编码。
三、Unicode编码集与UTF8、UTF16、UTF32
单独总结Unicode,表示该编码的重要性。在计算机领域中,Unicode编码是业界的一种标准。它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。
Unicode是字符集,UTF32、UTF16、UTF8是三种字符编码方案 。
Unicode字符集可以简写为UCS(Unicode Character Set),0x0000~0X00ff与ISO 8859-1保持一致
Unicode可以逻辑分为17平面(Plane),每个平面拥有65536( 共1114112)个代码点,虽然目前只有少数平面被使用。
平面0 (0000–FFFF): 基本多文种平面(Basic Multilingual Plane, BMP).
平面1 (10000–1FFFF): 多文种补充平面(SupplementaryMultilingual Plane, SMP).
平面2 (20000–2FFFF): 表意文字补充平面(SupplementaryIdeographic Plane, SIP).
平面3 (30000–3FFFF): 表意文字第三平面(TertiaryIdeographic Plane, TIP).
平面4 to 13 (40000–DFFFF)尚未使用
平面14 (E0000–EFFFF): 特别用途补充平面(SupplementarySpecial-purpose Plane, SSP)
平面15 (F0000–FFFFF)保留作为私人使用区(PrivateUse Area, PUA)
平面16 (100000–10FFFF),保留作为私人使用区(PrivateUse Area, PUA)
原文:https://blog.csdn.net/harrywater123/article/details/50738079
UTF8 是一种针对Unicode的可变长度字符编码,又称万国码, 用1到6个字节编码Unicode字符。
规则:如果只有一个字节则其最高二进制位为0;如果是多字节,其第一个字节从最高位开始,连续的二进制位值为1的个数决定了其编码的字节数,其余各字节均以10开头。
1.第一种是一个字节的编码:即128个ascii字符(只需要一个字节)
格式:0xxxxxxx
2^7 - 1 = 127 = 7F = (0111-1111)
编码方式Unicoe范围由(U+0000 至 U+007F)
2.第二种是两个字节的编码:即带有符号的拉丁文,希腊文,西里尔字母,亚美尼亚语,希伯来文,阿拉伯文等,则需要两个字节编码(Unicode 范围由U+0080至U+07FF)
格式:110xxxxx 10xxxxxx
(0080)16 = (128)10
(07FF) 16 = (2047)10 = 2^11-1;
3.第三种是三字节的编码,即其他多文种平面(BMP)中的字符(这包括了大部分的汉字)(范围为: U+0800 至 U+FFFF)
格式:1110xxxx 10xxxxxx 10xxxxxx
U+0800 = 2048;
U+FFFF = 65535 = 2^16 -1;
1110xxxx 10xxxxxx 10xxxxxx
4.第四种是4-6字节编码。
U+1 0000至U+1 FFFFF:使用四字节
U+20 0000 至U+3FF FFFF:使用五字节
U+400 0000至U+7FFF FFFF
UTF-8就是以8位为单元对UCS进行编码。从UCS-2到UTF-8的编码方式如下:
UCS-2编码(16进制)
范围
UTF-8 字节流(二进制)
0000 - 007F
0 - 127
0xxxxxxx
0080 - 07FF
128-2047
110xxxxx 10xxxxxx
0800 - FFFF
2048-65535
1110xxxx 10xxxxxx 10xxxxxx
例如“汉”字的Unicode编码是6C49。6C49在0800-FFFF之间,所以肯定要用3字节模板了:1110xxxx 10xxxxxx 10xxxxxx。将6C49写成二进制是:0110 110001 001001, 用这个比特流依次代替模板中的x,得到:11100110 10110001 10001001,即E6 B1 89。
目前计算机一般使用 2 个字节(16 位)来存放一个序号(DBCS,DoubleByte Character System),因此,这种方式存放的字符也被称作宽字节字符。比如,字符串”中文123” 在 Windows2000 下,内存中实际存放的是 5 个字符,一共10个字节;若在gb2312编码中,共计五个字符,7个字节。
原文:https://blog.csdn.net/harrywater123/article/details/50738079
优点,可变长度编码,对于常用的ASCII字符,只需要用一位编码即可,多字节的字符使用频率很低,节省了存储空间。
缺点,无法判断UTF8的字节数,较多 10xxxxxx 网络传输会产生错误。
UTF16 将0–65535范围内的字符编码成2个字节,空间利用率比UTF32高两倍
如果字符编码U小于0x10000,也就是十进制的0到65535之内,则直接使用两字节表示;
如果字符编码U大于0x10000,由于UNICODE编码范围最大为0x10FFFF,从0x10000到0x10FFFF之间 共有0xFFFFF个编码,也就是需要20个bit就可以标示这些编码。用U’表示从0-0xFFFFF之间的值,将其前 10 bit作为高位和16 bit的数值0xD800进行 逻辑or 操作,将后10 bit作为低位和0xDC00做 逻辑or 操作,这样组成的 4个byte就构成了U的编码。
UTF32 使用4字节的数字来表达每个字母、符号,或者表意文字(ideograph),每个数字代表唯一的至少在某种语言中使用的符号的编码方案,称为UTF-32。可以在常数时间内定位字符。
四、BOM
Unicode编码标准中用于标识文件是采用哪种格式的编码。
BOM —— Byte Order Mark,中文名译作“字节顺序标记”
UTF8不需要表明字节顺序,但是可以用BOM来表明编码方式。字符 “Zero Width No-Break Space” 的 UTF-8 编码是 EF BB BF。所以如果接收者收到以 EF BB BF 开头的字节流,就知道这是 UTF-8编码了。Windows 就是使用 BOM 来标记文本文件的编码方式的。
在保存一个以编utf8码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。对于一般的文件,这样并不会产生什么麻烦。在保存一个以utf8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。
编码 | 表示 (十六进制) | 表示 (十进制) |
---|---|---|
utf8 | EF BB BF | 239 187 191 |
utf16 大端 | FE FF | 254 255 |
utf16 小端 | FF FE | 255 254 |
utf32 大端 | 00 00 FE FF | 0 0 254 255 |
utf32 小端 | FF FE 00 00 | 255 254 0 0 |
iso8859-1
最早的编码是iso8859-1,和ascii编码相似。但为了方便表示各种各样的语言,逐渐出现了很多编码。iso8859-1属于单字节编码,最多能表示的字符范围是0-255,应用于英文系列。比如,字母a的编码为0x61=97。很明显,iso8859-1表示的字符范围很窄,无法表示中文字符。但是,由于是单字节编码,和计算机最基础的表示单位一致,所以很多时候,仍旧使用iso8859-1编码来表示。而且在很多协议上,默认使用该编码。比如,虽然”中文”两个字不存在iso8859-1编码,以gb2312编码为例,应该是”d6d0 cec4”两个字符,使用iso8859-1编码的时候则将它拆开为4个字节来表示:”d6 d0 ce c4”(事实上,在进行存储的时候,也是以字节为单位处理的)。而如果是UTF编码,则是6个字节”e4 b8 ad e6 96 87”。很明显,这种表示还需要以另一种编码为基础。
汉字编码:
* GB2312字集是简体字集,全称为GB2312(80)字集,共包括国标简体汉字6763个。 * BIG5字集是台湾繁体字集,共包括国标繁体汉字13053个。 * GBK字集是简繁字集,包括了GB字集、BIG5字集和一些符号,共包括21003个字符。 * GB18030是国家制定的一个强制性大字集标准,全称为GB18030-2000,它的推出使汉字集有了一个“大一统”的标准。
UCS:
通用字符集(Universal Character Set,UCS)是由ISO制定的ISO 10646(或称ISO/IEC 10646)标准所定义的字符编码方式,采用4字节编码。
UCS包含了已知语言的所有字符。
除了拉丁语、希腊语、斯拉夫语、希伯来语、阿拉伯语、亚美尼亚语、格鲁吉亚语,还包括中文、日文、韩文这样的象形文字,UCS还包括大量的图形、印刷、数学、科学符号。
* UCS-2: 与unicode的2byte编码基本一样。
* UCS-4: 4byte编码, 目前是在UCS-2前加上2个全零的byte。MIME:
通用因特网邮件扩充协议,它设计的最初目的是为了在发送电子邮件时附加多媒体数据,让邮件客户程序能根据其类型进行处理。然而当它被HTTP协议支持之后,它的意义就更为显著了。它使得HTTP传输的不仅是普通的文本,而变得丰富多彩。
因为在因特网上邮件发送协议SMTP存在几个缺点,主要是不能发送可执行文件和其他的二进制文件,只限于传送7位的ASCII码,因此MIME协议起初用于解决该问题,即是在传送二进制数据时先通过MIME转换成SMTP可传送的ACSII码,接收时再通过MIME还原成原始的二进制码。为此SMTP也响应增加了MIME-version、content-type等5个新的首部。
其中首部Content-transfer-encoding的值有5种—-“7bit”、”8bit”、”binary”、”quoted-printable”和”base64”—-其中”7bit”是缺省值,即不用转化的ASCII字符。真正常用是“quoted-printable”和”base64”两种,用以指明编码转换的方式。
MIME_type类型语法: media-type=type/subtype
媒体类型(type)与子类型(subtype)组成了MIME,它们之间使用反斜杠/分割,其中type可取值为:application audio example image message model multipart text video,subtype是某种类型的唯一标识符,比如:css gif xml等。
常见的MIME类型: 超文本标记语言文本 .html,.html text/html
普通文本 .txt text/plain
RTF文本 .rtf application/rtf
GIF图形 .gif image/gif
JPEG图形 .ipeg,.jpg image/jpeg
au声音文件 .au audio/basic
MIDI音乐文件 mid,.midi audio/midi,audio/x-midi
RealAudio音乐文件 .ra,.ram audio/x-pn-realaudio
MPEG文件 .mpg,.mpeg video/mpeg
AVI文件 .avi video/x-msvideo
GZIP文件 .gz application/x-gzip
TAR文件 .tar application/x-tarquoted-printable:
主要用于ACSII文本中夹杂少量非ASCII码字符的情况,不适合于转换纯二进制文件。它规定将每一个8位的字节,转换为3个字符。第一个字符是”=”号,这是固定不变的。
后面二个字符是二个十六进制数,分别代表了这个字节前四位和后四位的数值。举例来说,ASCII码中”换页键”(form feed)是12,二进制形式是00001100,写成十六进制就是0C,因此它的编码值为”=0C”。”=”号的ASCII值是61,二进制形式是00111101,因为它的编码值是”=3D”。除了可打印的ASCII码以外,所有其他字符都必须用这种方式进行转换。
所有可打印的ASCII码字符(十进制值从33到126)都保持原样不变,”=”(十进制值61)除外。
base64:
所谓Base64,就是说选出64个字符—-小写字母a-z、大写字母A-Z、数字0-9、符号”+”、”/“(再加上作为垫字的”=”,实际上是65个字符)—-作为一个基本字符集。然后,其他所有符号都转换成这个字符集中的字符。具体来说,转换方式可以分为四步:
第一步,将每三个字节作为一组,一共是24个二进制位。
第二步,将这24个二进制位分为四组,每个组有6个二进制位。
第三步,在每组前面加两个00,扩展成32个二进制位,即四个字节。
第四步,根据下表,得到扩展后的每个字节的对应符号,这就是Base64的编码值。
如果字节数不足三,则这样处理:
a)二个字节的情况:将这二个字节的一共16个二进制位,按照上面的规则,转成三组,最后一组除了前面加两个0以外,后面也要加两个0。这样得到一个三位的Base64编码,再在末尾补上一个”=”号。比如,”Ma”这个字符串是两个字节,可以转化成三组00010011、00010110、00010000以后,对应Base64值分别为T、W、E,再补上一个”=”号,因此”Ma”的Base64编码就是TWE=。
b)一个字节的情况:将这一个字节的8个二进制位,按照上面的规则转成二组,最后一组除了前面加二个0以外,后面再加4个0。这样得到一个二位的Base64编码,再在末尾补上两个”=”号。比如,”M”这个字母是一个字节,可以转化为二组00010011、00010000,对应的Base64值分别为T、Q,再补上二个”=”号,因此”M”的Base64编码就是TQ==。
参考与引用:
本文标题:字符集与字符编码
文章作者:whppmy
发布时间:2019-01-17
最后更新:2019-01-17
原始链接:http://bugnull.com/无处安放/字符集与字符编码/
版权声明:个人记录,没有获取同意时,禁止转载!!