[拾遗] 字符编码(Encoding)
程序员文章站
2024-02-29 18:53:10
...
之前对Unicode、UTF-8诸如此类一直不甚了了;
前日看到smartzxy的一篇关于Unicode的文章: http://www.iteye.com/topic/692602, 于是想进一步了解下UTF字符编码。
今天翻了下网上的资料和Unicode最新的文档5.2.0: http://www.unicode.org/versions/Unicode5.2.0/
暂且在这里做个读书笔记吧:
------------------------------------------------------------------------------------------------------------------------------------------------------------------
[size=medium][b]一. 概念普及[/b][/size]
[b]字符集就是实实在在的文字和图像等,就好比:世界上的每个人;
而字符编码就是给特定的字符集中的文字、图像等设定编号方便计算机辨认、处理和传输,就好比是:标识每个中国公民的身份ID,这里中国公民是一个特定的字符集,身份ID就是这个编码方式。(比喻不是很恰当,但可以这么理解。)[/b]
[color=blue][b] 由此可以推导: 一种字符编码是与某一个特定的字符集对应的,但是一个字符集却可能有多种字符编码(就好比:每个中国公民可以拥有中国的身份ID和国际的护照ID等多种标识方式,而中国的身份ID自然不能用来标识外国公民)[/b][/color]
------------------------------------------------------------------------------------------------------------------------------------------------------------------
[size=medium][b] 二. 字符编码[/b][/size]
那么我们接下来就来了解下都有哪些常用的字符编码方式:
[b]1. 常见的字符编码(Encoding)[/b]
ASCII字符编码:
ASCII编码1个字节 (8位) 来为字符编码,但实际上只用了一个字节的后7位,最高位统一规定为0,一共能表示128 (27)个字符。如:字符 'a' 的编码为 0110 0001,相当于十进制整数97,字符 'A' 的编码为 0100 0001,十进制整数为65。
ISO-8859-1字符编码:
又称Latin-1,是国际标准化组织(ISO)为西欧语言中的字符制定的编码,它用1个字节 (8位) 来为字符编码,共可表示255个字符。与ASCII编码兼容。(所谓兼容,是指对于相同的字符,它的编码值相同)。
[b][color=blue]UCS字符编码[/color][/b]:通用字符集(Universal Character Set,UCS)是由ISO制定的ISO 10646(或称ISO/IEC 10646)标准所定义的字符编码方式,采用4字节编码。UCS涵盖了已知语言的所有字符。
[b][color=blue]Unicode字符编码[/color][/b]:它是http://www.unicode.org制定的编码机制, 要将全世界常用文字都函括进去。使用2字节编码。
还有GB2312 字符编码、 GBK 字符编码、GB18030字符编码、BIG5、Shift-JIS等等;
[b] 2. UCS 和 Unicode的关系[/b]
两者由不同的组织制定,目的都是想涵盖所有的字符,自Unicode 2.0版本之后,Unicode开始与UCS的字库同步, 两者的历史关系可以参考Unicode 5.2.0文档的“Appendix C Relationship to ISO/IEC 10646”。
UCS编码有两种实现方式: UCS-2和 UCS-4
Unicode编码目前有三种实现方式: UTF-8、UTF-16和 UTF-32
UTF-32 基本等同于UCS-4(参考:http://zh.wikipedia.org/zh-cn/UTF-32),使用固定的32bit的编码方式;UTF-16原本是等同于UCS-2的,但就现在而言UTF-16应该是UCS-2的父集。
[b] 3. UTF-8 、 UTF-16和UTF-32[/b]
UTF-8 、 UTF-16和UTF-32是Unicode提供的三种编码实现方案, UTF是Unicode (或者UCS) Transformation Format的简称。
[size=small][table]
|All three encoding forms can be used to represent the full range of encoded characters in
the Unicode Standard; they are thus fully interoperable for implementations that may choose different encoding forms for various reasons. Each of the three Unicode encoding
forms can be efficiently transformed into either of the other two without any loss of data.
这三种编码方式能够描述Unicode标准中定义的所有的编码字符。每一种编码方式都能有效地无损地转化为其他两种编码方式。|
[/table][/size]
下面图截自Unicode文档:
[img]http://woniu1983.iteye.com/upload/picture/pic/66120/178a7eee-c59b-3842-8d99-5a6cf317d842.jpg[/img]
参考上图:
[b]UTF-32 [/b]: UTF-32是最为简单明了的编码方式,每个字符编码都是一个定长的二进制数(32bit, 4字节), 其范围从0 到 10FFFF。[b]---全部使用4字节表示[/b]
[b]UTF-16 [/b]: UTF-16稍微复杂些,当字符编码处于0...FFFF区间时,使用定长的16位二进制数表示,而处于10000...10FFFF区间时,使用一对16-bit(=32bit)二进制数来表示。 [b]---基本都是使用双字节表示,一些额外的部分则使用1对双字节表示[/b]
[b]UTF-8 [/b]: 相比于上面两种编码方式,UTF-8可能更为灵活。 在存储ASCII等单字节字符时,上面两种不免很多浪费,因此实现了“面向Byte”的UTF-8编码方式。 UTF-8是变长的,使用1字节、2字节、3字节和4字节四种方式来存储不同的字符。请看下图:
http://woniu1983.iteye.com/upload/picture/pic/66122/8c9e40b1-4a62-3c0f-9eca-ce50abc97468.jpg
[b][size=small][table]
|Scalar Value| First Byte|Second Byte|Third Byte |Fourth Byte|
|00000000 0xxxxxxx | 0xxxxxxx||||
|00000yyy yyxxxxxx| 110yyyyy|10xxxxxx|||
|zzzzyyyy yyxxxxxx| 1110zzzz|10yyyyyy|10xxxxxx||
|000uuuuu zzzzyyyy yyxxxxxx | 11110uuu|10uuzzzz|10yyyyyy|10xxxxxx|
[/table][/size][/b]
时间关系,先写这么多,后面再慢慢看看,有什么其他的再写。
前日看到smartzxy的一篇关于Unicode的文章: http://www.iteye.com/topic/692602, 于是想进一步了解下UTF字符编码。
今天翻了下网上的资料和Unicode最新的文档5.2.0: http://www.unicode.org/versions/Unicode5.2.0/
暂且在这里做个读书笔记吧:
------------------------------------------------------------------------------------------------------------------------------------------------------------------
[size=medium][b]一. 概念普及[/b][/size]
字符(Character):是文字与符号的总称,包括文字、图形符号、数学符号等。
字符集(Charset):即字符的集合,规定了在这些集合里面有哪些字符,常常和一种具体的语言文字对应起来,该文字中的所有字符或者大部分常用字符就构成了该文字的字符集。 。
字符编码(Encoding):计算机要处理各种字符,就需要将字符和二进制内码对应起来,这种对应关系就是字符编码(Encoding)。制定编码首先要确定字符集,并将字符集内的字符排序,然后和二进制数字对应起来。根据字符集内字符的多少,会确定用几个字节来编码。
[b]字符集就是实实在在的文字和图像等,就好比:世界上的每个人;
而字符编码就是给特定的字符集中的文字、图像等设定编号方便计算机辨认、处理和传输,就好比是:标识每个中国公民的身份ID,这里中国公民是一个特定的字符集,身份ID就是这个编码方式。(比喻不是很恰当,但可以这么理解。)[/b]
[color=blue][b] 由此可以推导: 一种字符编码是与某一个特定的字符集对应的,但是一个字符集却可能有多种字符编码(就好比:每个中国公民可以拥有中国的身份ID和国际的护照ID等多种标识方式,而中国的身份ID自然不能用来标识外国公民)[/b][/color]
------------------------------------------------------------------------------------------------------------------------------------------------------------------
[size=medium][b] 二. 字符编码[/b][/size]
那么我们接下来就来了解下都有哪些常用的字符编码方式:
[b]1. 常见的字符编码(Encoding)[/b]
ASCII字符编码:
ASCII编码1个字节 (8位) 来为字符编码,但实际上只用了一个字节的后7位,最高位统一规定为0,一共能表示128 (27)个字符。如:字符 'a' 的编码为 0110 0001,相当于十进制整数97,字符 'A' 的编码为 0100 0001,十进制整数为65。
ISO-8859-1字符编码:
又称Latin-1,是国际标准化组织(ISO)为西欧语言中的字符制定的编码,它用1个字节 (8位) 来为字符编码,共可表示255个字符。与ASCII编码兼容。(所谓兼容,是指对于相同的字符,它的编码值相同)。
[b][color=blue]UCS字符编码[/color][/b]:通用字符集(Universal Character Set,UCS)是由ISO制定的ISO 10646(或称ISO/IEC 10646)标准所定义的字符编码方式,采用4字节编码。UCS涵盖了已知语言的所有字符。
[b][color=blue]Unicode字符编码[/color][/b]:它是http://www.unicode.org制定的编码机制, 要将全世界常用文字都函括进去。使用2字节编码。
还有GB2312 字符编码、 GBK 字符编码、GB18030字符编码、BIG5、Shift-JIS等等;
[b] 2. UCS 和 Unicode的关系[/b]
两者由不同的组织制定,目的都是想涵盖所有的字符,自Unicode 2.0版本之后,Unicode开始与UCS的字库同步, 两者的历史关系可以参考Unicode 5.2.0文档的“Appendix C Relationship to ISO/IEC 10646”。
UCS编码有两种实现方式: UCS-2和 UCS-4
Unicode编码目前有三种实现方式: UTF-8、UTF-16和 UTF-32
UTF-32 基本等同于UCS-4(参考:http://zh.wikipedia.org/zh-cn/UTF-32),使用固定的32bit的编码方式;UTF-16原本是等同于UCS-2的,但就现在而言UTF-16应该是UCS-2的父集。
[b] 3. UTF-8 、 UTF-16和UTF-32[/b]
UTF-8 、 UTF-16和UTF-32是Unicode提供的三种编码实现方案, UTF是Unicode (或者UCS) Transformation Format的简称。
[size=small][table]
|All three encoding forms can be used to represent the full range of encoded characters in
the Unicode Standard; they are thus fully interoperable for implementations that may choose different encoding forms for various reasons. Each of the three Unicode encoding
forms can be efficiently transformed into either of the other two without any loss of data.
这三种编码方式能够描述Unicode标准中定义的所有的编码字符。每一种编码方式都能有效地无损地转化为其他两种编码方式。|
[/table][/size]
下面图截自Unicode文档:
[img]http://woniu1983.iteye.com/upload/picture/pic/66120/178a7eee-c59b-3842-8d99-5a6cf317d842.jpg[/img]
参考上图:
[b]UTF-32 [/b]: UTF-32是最为简单明了的编码方式,每个字符编码都是一个定长的二进制数(32bit, 4字节), 其范围从0 到 10FFFF。[b]---全部使用4字节表示[/b]
[b]UTF-16 [/b]: UTF-16稍微复杂些,当字符编码处于0...FFFF区间时,使用定长的16位二进制数表示,而处于10000...10FFFF区间时,使用一对16-bit(=32bit)二进制数来表示。 [b]---基本都是使用双字节表示,一些额外的部分则使用1对双字节表示[/b]
[b]UTF-8 [/b]: 相比于上面两种编码方式,UTF-8可能更为灵活。 在存储ASCII等单字节字符时,上面两种不免很多浪费,因此实现了“面向Byte”的UTF-8编码方式。 UTF-8是变长的,使用1字节、2字节、3字节和4字节四种方式来存储不同的字符。请看下图:
http://woniu1983.iteye.com/upload/picture/pic/66122/8c9e40b1-4a62-3c0f-9eca-ce50abc97468.jpg
[b][size=small][table]
|Scalar Value| First Byte|Second Byte|Third Byte |Fourth Byte|
|00000000 0xxxxxxx | 0xxxxxxx||||
|00000yyy yyxxxxxx| 110yyyyy|10xxxxxx|||
|zzzzyyyy yyxxxxxx| 1110zzzz|10yyyyyy|10xxxxxx||
|000uuuuu zzzzyyyy yyxxxxxx | 11110uuu|10uuzzzz|10yyyyyy|10xxxxxx|
[/table][/size][/b]
时间关系,先写这么多,后面再慢慢看看,有什么其他的再写。