字符编码总结

原创 2013年12月04日 18:10:10
ASCII
分两种
基本ASSIC字符集( ISO646)
高位为0,使用低7位编码
共有 128 个字符,其中有 96 个可打印字符,包括常用的字母、数字、标点符号等,另外还有 32 个控制字符。
扩展ASSIC字符集(ISO2022)
为满足不同国家的需求,在保持与 ISO646 兼容的前提下将 ASCII 字符集扩充为 8 位代码的统一方法,通过高位为1,可最多扩充128位
ISO 陆续制定了一批适用于不同地区的扩充 ASCII 字符集,


ISO 8859-1 又称 Latin-1
属于一种扩展的ASSIC字符集
它以ASCII为基础,在其空置的0xA0-0xFF的范围内,加入96个字母及符号,藉以供使用变音符号的拉丁字母语言使用。
此字符集用来支援部分于欧洲使用的语言,根据不同地区的需求,后面的“1”标志可能不同
兼容性
所以是兼容ASSIC的

ANSI 或 MBCS    (Muilti-Bytes Charecter Set,多字节字符集)    (并不是实际编码,多字节编码的统称)
为了扩充ASCII编码,以用于显示本国的语言,不同的国家和地区制定了不同的标准,由此产生了 GB2312, BIG5, JIS 等各自的编码标准。
这些使用 2 个字节来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码,又称为"MBCS(Muilti-Bytes Charecter Set,多字节字符集)"
例如:在简体中文系统下,ANSI 编码代表 GB2312 编码,在日文操作系统下,ANSI 编码代表 JIS 编码
转换
其中每个语言下的ANSI编码,都有一套一对一的编码转换器,Unicode变成所有编码转换的中间介质。
所有的编码都有一个转换器可以转换到Unicode,而Unicode也可以转换到其他所有的编码

GB2312
为了满足国内在计算机中使用汉字的需要,中国国家标准总局发布了一系列的汉字字符集国家标准编码,统称为GB码,或国标码
其中1980发布的标准号标准号为GB 2312-1980使用最为普遍,即我们的GB2312,GB2312是ANSI编码里的一种
兼容性
GB2312是一个简体中文字符集,GB2312编码用两个字节表示一个汉字
向下兼容ASSIC的
编码
汉字区的内码范围高字节从B0-F7,低字节从A1-FE,占用的码位是72*94=6768。其中有5个空位是D7FA-D7FE
即双字节位都没用完
收录
共7445,其中
共收录6763个汉字,其中一级汉字3755个,二级汉字3008个;
收录了包括拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母在内的682个全角字符。

GBK
GB2312的出现,基本满足了汉字的计算机处理需要,但对于人名、古汉语等方面出现的罕用字,并不能处理
这导致了后来GBK及GB 18030汉字字符集的出现,GBK即汉字内码扩展规范,K为扩展的汉语拼音中“扩”字的声母。
兼容性
向下完全兼容GB2312标准,和ASSIC,且包含了big5的所有汉字(即所有繁体文,但是包含而不是兼容!!!
编码方式
GBK编码汉字使用了双字节编码方案,其编码范围从8140至FEFE(剔除xx7F)
总体上说第一字节的范围是81–FE(也就是不含80和FF),第二字节的一部分领域在40–7E,其他领域在80–FE
收录
共23940个码位,共收录了21003个汉字,完全兼容GB2312-80标准,
支持国际标准ISO/IEC10646-1和国家标准GB13000-1中的全部中日韩汉字,并包含了BIG5编码中的所有汉字

gb18030
包含两个版本 GB18030-2000和GB18030-2005
标准采用单字节、双字节和四字节三种方式对字符编码。是对gbk的扩展
GB18030-2000是GBK的取代版本,它的主要特点是在GBK基础上增加了CJK统一汉字扩充A的汉字。
GB18030-2005的主要特点是在GB18030-2000基础上增加了CJK统一汉字扩充B的汉字(CJK就是中日韩的意思)
同时都还收录了藏文、蒙文、维吾尔文等主要的少数民族文字
兼容性
GB18030的编码采用单字节、双字节和4字节方案。其中单字节、双字节和GBK是完全兼容的。4字节编码的码位就是收录了CJK扩展A的6582个汉字
向下兼容gbk  gb2312 assic

BIG5
在台湾、香港与澳门地区,使用的是繁体中文字符集。而1980年发布的GB2312面向简体中文字符集,并不支持繁体汉字
兼容性
因为Big5的字符编码范围同GB2312字符的存储码范围存在冲突,所以在同一正文不能对两种字符集的字符同时支持
所以并不被gbk等兼容的,但注意gbk包含了繁体中文了,但码值和big5是不同的
big5 是兼容 assic的
编码
每个字符统一使用两个字节存储表示。“高位字节”使用了0x81-0xFE,“低位字节”使用了0x40-0x7E,及0xA1-0xFE

Base64
Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一
他把所有编码都转为可见的ASSIC码表示

在有的信息传递时,只支持标准的ASSIC码,所以高位为1的码,都会被强制为0,这样就造成了乱码
Base64把所有编码转为标准的ASSIC码,并且可以转回去

例如:
有的电子邮件系统不支持非英文字母,这是历史原因造成的
为了能让邮件正常的收发信件,就需要把由其他编码存储的符号转换成ASCII码来传输。
在一端发送GB2312编码->根据Base64规则->转换成ASCII码,接收端收到ASCII码->根据Base64规则->还原到GB2312编码


//==================接下来是Unicode的世界======================//

Unicode   万国码
Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案
它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求
(这使得你你可在一片文章中通览各国语言,而不会出现乱码了,呵呵)

优缺点
Unicode固然统一了编码方式,但是它的效率不高。可能浪费没用表示,这对存储和传输来说都很耗资源

兼容性
其首256字符保留给ISO 8859-1所定义的字符
注意包含和兼容的区别,Unicode包含各国字符,但只完全兼容ISO 8859-1

表示方式:
在表示一个Unicode的字符时,通常会用“U+”然后紧接着一组十六进制的数字来表示这一个字符
UCS-2  用U+    4位十六进制字符      即2字节描述
UCS-4  用U+    8位十六进制字符      即4字节描述
注意这是编码方式而不是,实现方式。识别时需要由实现方式的码转为编码方式的码,然后去判断哪个字符呢

层次 (Unicode 编码系统,可分为编码方式和实现方式两个层次)
编码方式 UCS (Universal Character Set)
编码方式分为两个等级,(注意编码方式,只是定义了每个码位的意义,而并不是指计算机里就是这么存储的)
UCS-2
用两个字节码编码 共2^16=65536个码位
UCS-4
用4个字节码编码 (实际上只用了31位,最高位必须为0)  有2^31=2147483648个码位

由最高字节分成2^7=128个group。每个group再根据次高字节分为256个plane。
每个plane根据第3个字节分为256rows,最后,每行包含256个cells 
BMP : group0的plane0被称作Basic Multilingual Plane, 即BMP  (或者说UCS-4中,高两个字节为0的码位被称作BMP)

将UCS-4的BMP去掉前面的两个零字节就得到了UCS-2。在UCS-2的两个字节前加上两个零字节,就得到了UCS-4的BMP。
而目前的UCS-4规范中还没有任何字符被分配在BMP之外

码位:
每个plane有2^16=65536个码位,而Unicode计划用17个码位,共17*65536=1114112个码位
即可用数字0-0x10FFFF来映射这些字符,UTF-8、UTF-16、UTF-32都是将数字转换到程序数据的编码方案

实现方式 UTF(Unicode Transformation Format)
实现方式是将编码方式转换到程序数据的方案
UTF-32
UTF-32编码以32位无符号整数为单位。UTF-32实现码就是其对应的USC-4的32位无符号整数
分大小端:UTF-32BE(Big Endian),UTF-32LE(Little Endian)
虽然转换简单,但是很是浪费啊,统一用1个32位无符号数表示,即存储时要用4字节来存储

UTF-16
UTF-16编码以16位无符号整数为单位分大小端:UTF-16BE(Big Endian),UTF-16LE(Little Endian)
转换方式
如果U编码<0x10000,UTF-16的实现码就是U编码对应的16位无符号整数
如果U编码≥0x10000,我们先计算U'=U-0x10000,然后将U'写成二进制形式:yyyy yyyy yyxx xxxx xxxx
U编码的UTF-16实现码就是:110110yyyyyyyyyy 110111xxxxxxxxxx

为什么U'可以被写成20个二进制位?Unicode的最大码位是0x10ffff,减去0x10000后,U'的最大值是0xfffff,
所以肯定可以用20个二进制位表示

所以需要1-2个16位的无符号数,即要么2个字节,要么4个字节去表示
所以对于USC-2的所有码位,其作为UTF-16来实现时,实现码就是其编码(不过要注意大小端)

UTF-8
UTF-8以字节为单位对Unicode进行编码,所以避免了大小端的问题,同时也不像utf-16和32那样浪费数据
根据码位的分布,可采用1-4个字节去表示, 是兼容ASSIC的
到底是多少个字节来表示一个字符,是通过首字节的高几位来区分的,具体转换方式参加百度百科

即使只考虑用4位表示,当4位时,能随机变的位数也有21位,完全能满足Unicode的1114112个码位










JAVA字符编码问题总结

  • 2013年06月20日 14:39
  • 25KB
  • 下载

tomcat字符编码总结

  • 2012年08月06日 15:07
  • 36KB
  • 下载

python中文字符编码decode,encode以及乱码解决总结

字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(en...

【总结】Java与字符编码问题详谈

一、字符集和字符编码方式  计算机只懂得0/1两种信号,而人类所使用的符号却无法尽数。要让计算机能够表示大千世界的符号,就一定要为每个符号指定一个唯一的整数。而这一套符号与整数的对应集合,就是我...

Unicode和字符编码总结

之前对字符编码一直有疑惑,最近查了一些资料,也看了一些文章,在此进行简单的总结,以便日后深入学习。 Unicode是一种编码标准,它确定了涵盖所有字符的通用字符集(Universal Charac...

python字符编码问题的总结

概述: 以前刚学python时候遇到了一些关于字符编码的奇怪问题,没有仔细研究,而且为了避免这个问题就全用英文了,但是今天开始写的程序需要抓取网页上的中文,解析下来后字符编码的问题又回来了,而且比以...
  • No_red
  • No_red
  • 2017年01月19日 23:42
  • 241

PHP字符编码绕过漏洞总结

PHP字符编码绕过漏洞总结       其实这东西国内少数黑客早已知道,只不过没有共享公布而已。有些人是不愿共享,宁愿烂在地里,另外的一些则是用来牟利。 该漏洞最早2006年被国外用来...
  • yatere
  • yatere
  • 2011年10月15日 02:39
  • 656

java下的字符编码转换总结

在java下进行软件开发的过程中,难免会遇到乱码的问题。如果不了解java字符编码转换的相关知识,很有可能就会对乱码一头雾水,搞不清道不明,活活恶心死!! 其实,只要认真搞清java下的编码知识,避...
  • wcy6340
  • wcy6340
  • 2013年08月15日 11:40
  • 630

【Qt】字符编码、乱码总结

[cpp] view plaincopy QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"...

字符编码总结:ASCII,Unicode和UTF-8

转载自:http://www.cnblogs.com/chenwenbiao/archive/2011/08/11/2134503.html 今天中午,我突然想搞清楚Un...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:字符编码总结
举报原因:
原因补充:

(最多只允许输入30个字)