字符集Charset与字符编码Character Encoding总结


原文链接: 字符集Charset与字符编码Character Encoding总结

字符集和字符编码(Charset & Encoding) - 吴秦 - 博客园
十分钟搞清字符集和字符编码 • cenalulu's Tech Blog
unicode wiki
unicode 箭头符号
unicode 装饰符号 0x27xx
UTF-16 - 维基百科,自由的百科全书
UTF-8 - 维基百科,自由的百科全书
GB 2312 - 维基百科,自由的百科全书
ascii
字符集 16进制编码 对应的二进制数据
UTF-8 0xE5B18C 1110 0101 1011 0001 1000 1100
UTF-16 0x5C4C 1011 1000 1001 1000
GBK 0x8CC5 1000 1100 1100 0101

对于一个字符集来说要正确编码转码一个字符需要三个关键元素:
字库表(character repertoire)、编码字符集UTF-8(coded character set)、字符编码Unicode(character encoding form)
字库表(character repertoire)字库表是一个相当于所有可读或者可显示字符的数据库,字库表决定了整个字符集能够展现表示的所有字符的范围。
编码字符集UTF-8(coded character set)编码字符集,即用一个编码值code point来表示一个字符在字库中的位置。
字符编码Unicode(character encoding form)字符编码,将编码字符集和实际存储数值之间的转换关系。一般来说都会直接将code point的值作为编码后的值直接存储

UTF-8 编码 -- UNICODE的一种变长字符编码又称万国码

UTF-8_Encoding_Scheme
每个字节的特征可见下表,其中x代表序号部分,把各个字节中的所有x部分拼接在一起就组成了在Unicode字库中的序号

  1. 开头的字符 有几个1 就代表有几位
  2. 跟随的字节 高位 全部时0b10开头
  3. utf8理论上最大可以表示6个字节的长度,6x6=36位.2003年11月,为了匹配UTF-16字符编码的约束,RFC 3629限制UTF-8以U+10FFFF结束。移除了所有5字节和6字节序列,以及大约4字节序列的一半。所以utf8目前最大4字节就够了.
    > The original specification covered numbers up to 31 bits (the original limit of the Universal Character Set). In November 2003 UTF-8 was restricted by RFC 3629 to end at U+10FFFF, in order to match the constraints of the UTF-16 character encoding. This removed all 5- and 6-byte sequences, and about half of the 4-byte sequences.
    Unicode Byte 1 Byte 2 Byte3 Byte4
    0x0000 ~ 0x007F(7) 0xxx xxxx
    0x0080 ~ 0x07FF(11) 110x xxxx 10xx xxxx
    0x0800 ~ 0xFFFF(16) 1110 xxxx 10xx xxxx 10xx xxxx
    0x10000 ~ 0x1FFFF(21) 1111 0xxx 10xx xxxx 10xx xxxx 10xx xxxx
    我们分别看三个从一个字节到三个字节的UTF-8编码例子:
    字符 Unicode字库序号 Unicode 二进制 UTF-8编码 UTF-8编码
    $ 0024 0010 0100 0010 0100 24
    ¢ 00A2 0000 0000 1010 0010 1100 0010 1010 0010 C2 A2
    € 20AC 0010 0000 1010 1100 1110 0010 1000 0010 1010 1100 E2 82 AC

字符UnicodeUnicode 二进制UTF-8编码UTF-8编码
$00240000 0000 0010 01000010 010024
¢00A20000 0000 1010 00101100 0010 1010 0010C2 A2
20AC0010 0000 1010 11001110 0010 1000 0010 1010 1100E2 82 AC

不难从以上的简单介绍中得出以下规律:
1个字节的UTF-8十六进制编码一定是以比8>小的数字开头的
2个字节的UTF-8十六进制编码一定是以C或D开头的 紧跟1个 8-B 开头
3个字节的UTF-8十六进制编码一定是以E开头的 紧跟2个 8-B 开头
4个字节的UTF-8十六进制编码一定是以F开头的 紧跟3个 8-B 开头

为什么会出现乱码

字符 UTF-8编码后的十六进制
很 E5BE88
屌 E5B18C
于是我们得到了E5BE88E5B18C这么一串数值。而显示时我们用GBK解码进行展示,通过查表我们获得以下信息:

两个字节的十六进制数值 GBK解码后对应的字符
E5BE 寰
88E5 堝
B18C 睂
解码后我们就得到了寰堝睂这么一个错误的结果,更要命的是连字符个数都变了。

Mysql 编码转换

select HEX(convert('磊' using gbk));
select convert(0xC0DA using gbk);
select HEX(convert('磊' using utf8));
select convert(0xE7A38A using utf8);

常见问题处理之Emoji

所谓Emoji就是一种在Unicode位于\u1F601-\u1F64F区段的字符,位于unicode 的第二个 plane. 这个显然超过了目前常用的UTF-8字符集的编码范围\u0000-\uFFFF

4.Accept-Charset/Accept-Encoding/Accept-Language/Content-Type/Content-Encoding/Content-Language
在HTTP中,与字符集和字符编码相关的消息头是Accept-Charset/Content-Type,另外主区区分Accept-Charset/Accept-Encoding/Accept-Language/Content-Type/Content-Encoding/Content-Language:

Accept-Charset:浏览器申明自己接收的字符集,这就是本文前面介绍的各种字符集和字符编码,如gb2312,utf-8(通常我们说Charset包括了相应的字符编码方案);

Accept-Encoding:浏览器申明自己接收的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法(gzip,deflate),(注意:这不是只字符编码);

Accept-Language:浏览器申明自己接收的语言。语言跟字符集的区别:中文是语言,中文有多种字符集,比如big5,gb2312,gbk等等;

Content-Type:WEB服务器告诉浏览器自己响应的对象的类型和字符集。例如:Content-Type: text/html; charset='gb2312'

Content-Encoding:WEB服务器表明自己使用了什么压缩方法(gzip,deflate)压缩响应中的对象。例如:Content-Encoding:gzip

Content-Language:WEB服务器告诉浏览器自己响应的对象的语言。

##编码与解码
计算机用二进制存储信息。将英文、汉字等符号转成二进制称作编码,反之,将二进制解析成对应的英文、汉字等符号称作解码。
##字符集与字符编码
字符集(Charset)是一个系统支持的所有抽象字符的集合。字符是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。
字符编码(Character Encoding):是一套法则,使用该法则能够对自然语言的字符的一个集合(如字母表或音节表),与其他东西的一个集合(如号码或电脉冲)进行配对。
##常用字符集和字符编码

  • ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统。它主要用于显示现代英语。
  • GB2312或GB2312-80是中国国家标准 简体中文 字符集,收录6763个汉字,它所收录的汉字已经覆盖中国大陆99.75%的使用频率。
  • GBK是对GB2312-80的扩展,微软利用GB2312-80未使用的编码空间,收录GB 13000.1-93全部字符制定了GBK编码,并非国家标准。
  • GB18030,全称:国家标准 GB18030-2005《信息技术 中文编码字符集》,是中华人民共和国现时最新的内码字集
  • Big5,又称为大五码或五大码,是使用繁体中文 (正体中文)社区中最常用的电脑汉字字符集标准,共收录13,060个汉字。
  • Unicode编码系统为表达任意语言的任意字符而设计。它使用4字节的数字来表达每个字母、符号,或者表意文字(ideograph)。每个数字代表唯一的至少在某种语言中使用的符号。


Unicode是字符集

在表示一个Unicode的字元时,通常会用“U+”然后紧接着一组十六进制的数字来表示这一个字元

###编码方式:
统一码的编码方式与ISO 10646的通用字符集(UCS)概念相对应。目前实际应用的统一码版本对应于UCS-2,使用16位的编码空间。也就是每个字符占用2个字节。这样理论上一共最多可以表示216(即65536)个字符。基本满足各种语言的使用。
###实现方式:
Unicode的实现方式不同于编码方式。一个字符的Unicode编码是确定的。但是在实际传输过程中,由于不同系统平台的设计不一定一致,以及出于节省空间的目的,对Unicode编码的实现方式有所不同。Unicode的实现方式称为Unicode转换格式(Unicode Transformation Format,简称为UTF)

  • UTF-32 : 使用4个字节的数字来表达每个符号的编码方案称为UTF-32

  • UTF-16 : 尽管有Unicode字符非常多,但是实际上大多数人不会用到超过前65535个以外的字符。因此,就有了另外一种Unicode编码方式,叫做UTF-16(因为16位 = 2字节)。UTF-16将0–65535范围内的字符编码成2个字节,如果真的需要表达那些很少使用的"星芒层(astral plane)"内超过这65535范围的Unicode字符,则需要使用一些诡异的技巧来实现。由于对UTF-16两个字节顺序的理解不一致,产生了大端序和小端序的概念。

  • UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode 的可变长度字符编码,UTF-8使用一至四个字节 为每个字符编码。它可以用来表示Unicode标准中的任何字符,且其编码中的第一个字节 仍与ASCII 兼容。

##Code Page

在非Unicode环境下,由于不同国家和地区采用的字符集不一致,很可能出现无法正常显示所有字符的情况。微软公司使用了代码页(Codepage)转换表的技术来过渡性的部分解决这一问题,即通过指定的转换表将非Unicode的字符编码转换为同一字符对应的系统内部使用的Unicode编码。可以在“语言与区域设置”中选择一个代码页作为非Unicode编码所采用的默认编码方式,如936为简体中文GB码,950为繁体中文Big5(皆指PC上使用的)。在这种情况下,一些非英语的欧洲语言编写的软件和文档很可能出现乱码。而将代码页设置为相应语言中文处理又会出现问题,这一情况无法避免。只有完全采用统一编码才能彻底解决这些问题,但目前尚无法做到这一点。

代码页技术现在广泛为各种平台所采用。UTF-7的代码页是65000,UTF-8的代码页是65001。

##XML和Unicode
XML及其子集XHTML采用UTF-8作为标准字集,理论上我们可以在各种支持XML标准的浏览器上显示任何地区文字的网页,只要电脑本身安装有合适的字体即可。可以利用&#nnn;的格式显示特定的字符。nnn代表该字符的十进制Unicode代码。如果采用十六进制代码,在编码之前加上x字符即可。但部分旧版本的浏览器可能无法识别十六进制代码。

  1. BOM
  2. iso-8859-1

http://www.cnblogs.com/winter-cn/archive/2012/01/27/2328512.html

附录:

字符集 字数 Unicode 编码
基本汉字 20902字 4E00-9FA5
基本汉字补充 74字 9FA6-9FEF
扩展A 6582字 3400-4DB5
扩展B 42711字 20000-2A6D6
扩展C 4149字 2A700-2B734
扩展D 222字 2B740-2B81D
扩展E 5762字 2B820-2CEA1
扩展F 7473字 2CEB0-2EBE0
康熙部首 214字 2F00-2FD5
部首扩展 115字 2E80-2EF3
兼容汉字 477字 F900-FAD9
兼容扩展 542字 2F800-2FA1D
PUA(GBK)部件 81字 E815-E86F
部件扩展 452字 E400-E5E8
PUA增补 207字 E600-E6CF
汉字笔画 36字 31C0-31E3
汉字结构 12字 2FF0-2FFB
汉语注音 43字 3105-312F
注音扩展 22字 31A0-31BA
〇 1字 3007

`