字符与字符编码
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
"中文123" 占7个 字节
在内存中,如果“字符”是以在 UNICODE 中的序号存在的,那么 L"中文123" 占10 UNICODE字符 我们称这种字符串为 UNICODE 串 字符串或者宽字节字符串。 个字节
7
由于不同 ANSI 编码所规定的标准是不相同 的,因此,对于一个给定的多字节字符串, 我们必须知道它采用的是哪一种编码规则, 才能够知道它包含了哪些“字符”。 而对于 UNICODE 字符串来说,不管在什么 环境下,它所代表的“字符”内容总是不变的。
15
UCS-2和UTF-16
Unicode组织和ISO组织都试图定义一个超大字符 集,这个字符集就是通用字符集(UCS,Universal Character Set)。这两个组织经过协调,虽然在各 自发展,但定义的字符位置是完全一致的。 前两个字节的位置(0x0000-0xFFFD)被称为基本 多语言面(Basic Multilingual Plane, BMP) ,超 出两个字节的范围称作辅助语言面。BMP基本包括 了所有语言中绝大多数字符,所以只要支持BMP就 可以支持绝大多数场合下的应用。Unicode 3.0对应 的字符集在BMP范围内。
2D 4E 87 65 31 0 32 0 中 文 1 2 33 3 0 0 \0 0
6
2字符,字节,字符串
概念描述 人们使用的记号,抽象意义上的 字符 一个符号。 计算机中存储数据的单元,一个 8位的二进制数,是一个很具体 字节 的存储空间。 在内存中,如果“字符”是以 ANSI 编码形式存在的,一个字 符可能使用一个字节或多个字节 来表示,那么我们称这种字符串 为 ANSI 字符串或者多字节字符 ANSI 字符串 串。 举例 1', '中', 'a', '$', '¥', …… 0x01, 0x45, 0xFA, ……
源自文库
阶段二
阶段三
3
字符串在内存中的存放方法
在 ASCII 阶段,单字节字符串使用一个字节 存放一个字符(SBCS)。比如,“Bob123” 在内存中为:
42 6F 62 31 32 33 0 B o b 1 2 3 \0
4
字符串在内存中的存放方法
在使用 ANSI 编码支持多种语言阶段,每个 字符使用一个字节或多个字节来表示 (MBCS),因此,这种方式存放的字符也 被称作多字节字符。比如,"中文123" 在中文 Windows 95 内存中为7个字节,每个汉字占 2个字节,每个英文和数字字符占1个字节:
9
各个国家和地区在制定编码标准的时候,“字 符的集合”和“编码”一般都是同时制定的。因 此,平常我们所说的“字符集”,比如: GB2312, GBK, JIS 等,除了有“字符的集合” 这层含义外,同时也包含了“编码”的含义。
10
4 常用字符集介绍
ASCII码是7位编码,编码范围是0x000x7F。ASCII字符集包括英文字母、阿拉伯 数字和标点符号等字符。其中0x00-0x20和 0x7F共33个控制字符。 只支持ASCII码的系统会忽略每个字节的最高 位,只认为低7位是有效位。HZ字符编码就 是早期为了在只支持7位ASCII系统中传输中 文而设计的编码。早期很多邮件系统也只支 持ASCII编码,为了传输中文邮件必须使用 BASE64或者其他编码方式。
11
GB2312
GB2312是一种基于ASCII的ANSI编码。 GB2312收录简化汉字及符号、希腊字母、日 文平假名及片假名字母、俄语西里尔字母等 字符,共7445个图形字符,其中汉字占6763 个。 编码范围:0xA1A1--0xFEFE 汉字范围:0xB0A1--0xF7FE
12
GB2312规定"对任意一个图形字符都采用两 个字节表示,每个字节均采用七位编码表示 ",习惯上称第一个字节为"高字节",第二个 字节为"低字节"。
19
UCS-2和UTF-16也可以理解为和ASCII兼 容,在ASCII编码的每个字节前加上0x00, 就得到相应字符的UCS-2编码。 UCS-2和UTF-16中会使用0x00作为某个字符 编码的一部分,某些系统会把0x00当作字符 串结束的标志,在处理UCS-2或UTF-16编码 时会出现问题。
16
UCS-2、UTF-16是UCS字符集(或者说是 Unicode字符集)实际应用中的具体编码方 式。UCS-2是两个字节的等宽编码,因为只 是使用了两个字节的编码空间,所以只能对 BMP中的字符做编码。 UTF-16是变长编码,用两个字节对BMP内的 字符编码,用4个字节对超出BMP范围的辅 助平面内的字符作编码。
24
UTF-8中的每个字符编码的首字节总在0x00-0xFD 之间(不考虑UCS-4支持的情况,首字节在0x000xEF之间)。根据首字节就可以判断之后连续几 个字节。 在UTF-8的编码的传输过程中即使丢掉一个字 节,根据编码规律也很容易定位丢掉的位置,不 会影响到其他字符。在其他双字节编码中,一旦 损失一个字节,就会影响到此字节之后的所有字 符。从这点可以看出UTF-8编码非常适合作为传 输编码。
20
UTF-8
UTF-8是UCS字符集的另一种编码方式, UTF-16的每个单元是两个字节(16位),而 UTF-8的每个单元是一个字节(8位)。UTF16中用一个或两个双字节表示一个字符, UTF-8中用一个或几个单字节表示一个字 符。
21
从UCS-2到UTF-8之间有以下转换关系:
UCS-2 UTF-8 U+0000 - U+007F 0xxxxxxx U+0080 - U+07FF 110xxxxx 10xxxxxx U+0800 - U+FFFF 1110xxxx 10xxxxxx 10xxxxxx
13
GBK
GBK是GB2312的扩展,是向上兼容的。它包含 了20902个汉字。同时GBK收录了Unicode基本 多文种平面中的所有CJK汉字。 编码范围:0x8140 - 0xFEFE 。高字节范围是 0×81-0xFE,低字节范围是0x40-7E和0x800xFE 低字节是0x40-0x7E的GBK字符有一定特殊 性,因为这些字符占用了ASCII码的位置,这 样会给一些系统带来麻烦。
23
UTF-8的特性
UTF-8完全和ASCII兼容,也就是说ASCII对应的 字符在UTF-8中和ASCII编码完全一致。范围在 0x00-0x7F之内的字符一定是ASCII字符,不可能 是其他字符的一部分。GBK和Big5都存在的缺陷 在UTF-8中是不存在的。 大于U+007F的UCS字符,在UTF-8编码中至少是 两个字节。 GBK编码中的汉字字符都在UCS-2中的范围都在 U+0800 - U+FFFF之间,所以每个GBK编码中的 汉字字符的UTF-8编码都是3个字节。
8
3 字符集与编码
各个国家和地区所制定的不同 ANSI 编码标准 中,都只规定了各自语言所需的“字符”。比如:汉 字标准(GB2312)中没有规定韩国语字符怎样存 储。这些 ANSI 编码标准所规定的内容包含两层 含义: 1. 使用哪些字符。也就是说哪些汉字,字母和符号 会被收入标准中。所包含“字符”的集合就叫做“字 符集”。 2. 规定每个“字符”分别用一个字节还是多个字节存 储,用哪些字节来存储,这个规定就叫做“编码”。
17
UTF-16是UCS-2的超集,UTF-16编码的两 字节编码方式完全和UCS-2相同,也就是说 在BMP的框架内UCS-2完全等同与UTF-16。 实际情况当中常常把UCS-16当作UCS-2的别 名。
18
UCS-2和UTF-16在存储和传输时会使用两种不同的 字节序,分别是big endian和little endian(大尾和 小尾)。例如“啊”(U+554A)用big endian表示就 是0x554A,用little endian表示就是0x4A55。UCS2和UTF-16默认的字节序是big endian方式。 在传输过程中为了说明字节序需要在字节流前加上 BOM(Byte order Mark),0xFEFF表示是big endian,0xFFFE表示是little endian。UCS-2BE、 UCS-2LE是实际应用中使用的编码名称,对应着 big endian和little endian,UTF-16BE、UTF-16LE 也是如此。因为默认是BE字节序,所以可以把 UCS-2当做是UCS-2BE的别名。
D6 D0 CE C4 31 32 33 0 中 文 1 2 3 \0
5
字符串在内存中的存放方法
在 UNICODE 被采用之后,计算机存放字符串时, 改为存放每个字符在 UNICODE 字符集中的序号。 目前计算机一般使用 2 个字节(16 位)来存放一个 序号(DBCS),因此,这种方式存放的字符也被 称作宽字节字符。比如,字符串 "中文123" 在 Windows 2000 下,内存中实际存放的是 5 个序 号:一共占 10 个字节。
25
Unicode字符串,每个字符(汉字、英文字母)都占2 个字节,以2个连续的\0结尾,NT操作系统内核用 的是这种字符串。 UTF-8是Unicode一种压缩形式,英文A在Unicode 中表示为0x0041,老外觉得这种存储方式浪费了 50%的空间,于是就把英文压缩成1个字节,成了 UTF-8编码,但是汉字在UTF-8中占3个字节,显然 用做中文不如ANSI合算。这就是中国的网页用作 ANSI编码而老外的网页常用UTF-8的原因。 UTF-8在还游戏里运用的很广泛,比如WOW的lua 脚本等。
14
Big5
Big5是双字节编码,高字节编码范围是0x810xFE,低字节编码范围是0x40-0x7E和0xA10xFE。和GBK相比,少了低字节是0x80-0xA0的组 合。 Big5收录的汉字只包括繁体汉字,不包括简体汉 字,一些生僻的汉字也没有收录。 因为Big5也占用了ASCII的编码空间(低字节所使 用的0x40-0x7E),所以Big5编码在一些环境下存 在和GBK编码相同的问题,即低字节范围为0x400x7E的字符有可能会被误处理。
22
例如“啊”字的UCS-2编码是0x554A,对应的二进制 是0101 0101 0100 1010,转成UTF-8编码之后的 二进制是1110 0101 10 010101 10 001010,对应 的十六进制是0xE5958A。 UCS-4也是一种UCS字符集的编码方式,是使用4 个字节的等宽编码,可以用UCS-4来表示BMP之外 的辅助面字符。UCS-2中每两个字节前再加上 0x0000就得到了BMP字符的UCS-4编码。从UCS-4 到UTF-8也存在转换关系,根据这种转换关系, UTF-8最多可以使用六个字节来编码UCS-4。
字符与编码
Outline
1.字符与编码的发展 2.字符,字节,字符串 3.字符集与编码 4.常用字符集介绍 5. MIME邮件的编码方式
2
1 字符与编码的发展
阶段一 说明 系统 计算机刚开始只支持英语,其它语言不能够在计算机上存储和 ASCII 显示。 英文 DOS 为使计算机支持更多语言,通常使用 0x80~0xFF 范围的 2 个字节来表示 1 个字符。比如:汉字 '中' 在中文操作系统 ANSI编码 中,使用 [0xD6,0xD0] 这两个字节存储。 (本地化) 不同的国家和地区制定了不同的标准,由此产生了 GB2312, BIG5, JIS 等各自的编码标准。这些使用 2 个字节来代表一 个字符的各种汉字延伸编码方式,称为 A N S I 编码。在简体 中文系统下,ANSI 编码代表 GB2312 编码,在日文操作系统 下,ANSI 编码代表 JIS 编码。 中文 DOS,中文 不同 ANSI 编码之间互不兼容,当信息在国际间交流时,无法 Windows 将属于两种语言的文字,存储在同一段 A N S I 编码的文本中 95/98,日文 Windows 95/98 。 为了使国际间信息交流更加方便,国际组织制定了 U N I C O D E Windows 字符集,为各种语言中的每一个字符设定了统一并且唯一的数 NT/2000/XP, UNICODE 字编号,以满足跨语言、跨平台进行文本转换、处理的要求。 Linux,Java 系统内码