More Related Content Similar to Character Encoding - Concepts and Practices (17) Character Encoding - Concepts and Practices1. Character Encoding
Concepts and Practices
Roger
yixx@ucweb.com
roger2yi@gmail.com
www.twitter.com/roger2yi
2011/6/1 1
3. Definition
• A character encoding system • 简而言之,字符编码就是
consists of a code that pairs 将字符通过编码转换成另
each character from a given
repertoire with something
外一种表现形式,可能是
else, such as a sequence of 自然数的序列,八位组,
natural numbers, octets or 电子脉冲等
electrical pulses, in order to – 从上面的定义看,摩斯码,
facilitate the transmission of 电报码也是字符编码的一种
data (generally numbers 方式
and/or text) through – 当然我们一般说的字符编码
telecommunication networks 实际上是以八位组的方式编
or storage of text in 码,使用计算机进行显示,
computers. 存储和传输
2011/6/1 3
6. Cont.
• CJK(中日韩)东亚语言的编码
– 大陆简体中文的国标编码 — GB2312,GBK,GB18030
– 台湾繁体中文 Big5(大5码)
– 日语 Shift JIS, EUC-JP,ISO-2022-JP
– 朝鲜语 EUC-KR,ISO-2022-KR
2011/6/1 6
7. Cont.
• Unicode编码
– UTF-8
– UTF-16 (BE/LE)
• UCS-2 是UTF-16的一个子集,我们在说UTF-16的时候实际包括了
UCS-2,后面会讲到两者的区别
– UTF-32 (BE/LE)
• UCS-4跟UTF-32其实是一样的编码
2011/6/1 7
8. Coding Modal
• 非Unicode的编码,编码模型比较简单,就是将字符映射
成一个八位组
• Unicode则建立了一个比较复杂的编码模型,简单的说可
以分成下面几步:
– character set - 确认编码包括的所有字符
– coded character set - 为包括的每一个字符分配一个唯一的正整数,这
个正整数被称为code points
– character encoding form - 将每一个code point编码成一个或者若干个
有限范围的整数值的集合(8位/16位/32位)
– character encoding scheme - 将有限范围的整数值编码成一个八位组,
16位和32位整数涉及字节序的问题(LE/BE)
2011/6/1 8
10. 分类方式
定长 变长
8位 ACSII GB2312,GBK,GB18030
ISO 8859 1~10,11,13~16 BIG-5
Shift JIS,EUC-JP
EUC-KR
UTF-8
16位 USC-2 UTF-16
32位 UTF-32
2011/6/1 10
11. 字串类型
• char*,std::string, • wchar_t*,std::wstring
WTF::CString,byte[] – whar_t是一个类型定义,
一般是16位无符号数,不过
– 代表一个8位定长或者变长 有的编译器/平台的定义为
编码的字串 32位无符号数,LE or BE
– 具体的编码无法通过数据类 由平台本身决定
型本身获得,需要程序预先 – 如果wchar_t是16位的,
知道或者从其它途径获得 wchar_t*代表的是一个
UCS-2编码的字串(16位定
长Unicode)
– 如果wchar_t是32位的,
wchar_t*代表的是一个
UCS-4编码的字串(32位
定长Unicode)
2011/6/1 11
12. Cont.
• String(Java),string (.Net),QString(Qt),
WTF::String(WebKit/WTF)
– 内部都是采用UTF-16编码(变长16位Unicode), LE or BE由平
台决定
– Java/.Net/Qt这样的应用程序框架都内置了编码转换功能,支持
将其它编码转成UTF-16,或者从UTF-16转换成其它编码
– WebKit需要第三方库提供编码转换功能,具体使用的库在不同的
porting版本上可能不一样,一般使用的是ICU,Qt的porting使
用的是Qt本身的编码转换
2011/6/1 12
13. ASCII兼容性
• 一般其它编码的码表都是 • 进一步说,对于8位的编
向下兼容ASCII码表,比 码,无论是定长还是变长,
如说Unicode的码表 一般跟ASCII都是二进制
– ASCII码表里面的字符的编
兼容的
码值跟该字符在Unicode码 – 假设一个用UTF-8编码的字
表里面的code point是一样 串,如果里面只包含ASCII
的 字符(英文字母,数字,英
文标点符号等),你使用
– 简单说就是假设一个 ASCII编码去转码是完全无
Unicode的字符,如果它的 错的
值 <128,其实就可以当作
一个ASCII字符来处理
2011/6/1 13
14. 编码检测
• 对于外部来源的文本数据,比如文本文件,Web页面等,
我们需要获知它的具体编码,然后再转换成内部的字串类
型进行进一步处理
– 如果已知是UTF-16,可以检查头两个字节是否是一个BOM( U+FEFF,在
UNICODE中代表的意义是ZERO WIDTH NO-BREAK SPACE)来检测编码的字
节序
• UTF-16LE以FF FE代表,UTF-16BE以FE FF代表
– 如果HTTP包,可以检查Header
• Content-Type: text/html; charset=ISO-8859-4
– 如果是XML(文件或者页面),可以检查XML声明
• <?xml version="1.0" encoding="UTF-8" ?>
– 如果上面的方式都不可用,只能通过某种模式匹配的方式来猜测具体的编码类型,
或者让用户自己选择编码
2011/6/1 14
15. The End
Thank you for your listening
Yours Sincerely, Roger
2011/6/1 15