编码格式转帖
1. 编码问题的由来,相关概念的理解1.1 字符与编码的发展
从计算机对多国语言的支持角度看,大致可以分为三个阶段:
系统内码说明系统阶段一ASCII计算机刚开始只支持英语,其它语言不能够在计算机上存储和显示。英文 DOS阶段二ANSI编码
(本地化)为使计算机支持更多语言,通常使用 0x80~0xFF 范围的 2 个字节来表示 1 个字符。比如:汉字 '中' 在中文操作系统中,使用 这两个字节存储。
不同的国家和地区制定了不同的标准,由此产生了 GB2312, BIG5, JIS 等各自的编码标准。这些使用 2 个字节来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码。在简体中文系统下,ANSI 编码代表 GB2312 编码,在日文操作系统下,ANSI 编码代表 JIS 编码。
不同 ANSI 编码之间互不兼容,当信息在国际间交流时,无法将属于两种语言的文字,存储在同一段 ANSI 编码的文本中。中文 DOS,中文 Windows 95/98,日文 Windows 95/98阶段三UNICODE
(国际化)为了使国际间信息交流更加方便,国际组织制定了 UNICODE 字符集,为各种语言中的每一个字符设定了统一并且唯一的数字编号,以满足跨语言、跨平台进行文本转换、处理的要求。Windows NT/2000/XP,Linux,Java字符串在内存中的存放方法:
在 ASCII 阶段,单字节字符串使用一个字节存放一个字符(SBCS)。比如,"Bob123" 在内存中为:
426F6231323300http://mxdxm.iteye.com/admin/images/spacer.gifhttp://mxdxm.iteye.com/admin/images/spacer.gifhttp://mxdxm.iteye.com/admin/images/spacer.gifhttp://mxdxm.iteye.com/admin/images/spacer.gifhttp://mxdxm.iteye.com/admin/images/spacer.gifhttp://mxdxm.iteye.com/admin/images/spacer.gifhttp://mxdxm.iteye.com/admin/images/spacer.gifBob123\0在使用 ANSI 编码支持多种语言阶段,每个字符使用一个字节或多个字节来表示(MBCS),因此,这种方式存放的字符也被称作多字节字符。比如,"中文123" 在中文 Windows 95 内存中为7个字节,每个汉字占2个字节,每个英文和数字字符占1个字节:
D6D0CEC431323300http://mxdxm.iteye.com/admin/images/spacer.gifhttp://mxdxm.iteye.com/admin/images/spacer.gifhttp://mxdxm.iteye.com/admin/images/spacer.gifhttp://mxdxm.iteye.com/admin/images/spacer.gifhttp://mxdxm.iteye.com/admin/images/spacer.gifhttp://mxdxm.iteye.com/admin/images/spacer.gif中文123\0在 UNICODE 被采用之后,计算机存放字符串时,改为存放每个字符在 UNICODE 字符集中的序号。目前计算机一般使用 2 个字节(16 位)来存放一个序号(DBCS),因此,这种方式存放的字符也被称作宽字节字符。比如,字符串 "中文123" 在 Windows 2000 下,内存中实际存放的是 5 个序号:
2D4E87653100320033000000 ← 在 x86 CPU 中,低字节在前http://mxdxm.iteye.com/admin/images/spacer.gifhttp://mxdxm.iteye.com/admin/images/spacer.gifhttp://mxdxm.iteye.com/admin/images/spacer.gifhttp://mxdxm.iteye.com/admin/images/spacer.gifhttp://mxdxm.iteye.com/admin/images/spacer.gifhttp://mxdxm.iteye.com/admin/images/spacer.gifhttp://mxdxm.iteye.com/admin/images/spacer.gif中文123\0 一共占 10 个字节。
http://mxdxm.iteye.com/admin/images/blue_rule.gifhttp://mxdxm.iteye.com/admin/images/u_bold.gif回页首
1.2 字符,字节,字符串
理解编码的关键,是要把字符的概念和字节的概念理解准确。这两个概念容易混淆,我们在此做一下区分:
概念描述举例字符人们使用的记号,抽象意义上的一个符号。'1', '中', 'a', '$', '¥', ……字节计算机中存储数据的单元,一个8位的二进制数,是一个很具体的存储空间。0x01, 0x45, 0xFA, ……ANSI
字符串在内存中,如果“字符”是以 ANSI 编码形式存在的,一个字符可能使用一个字节或多个字节来表示,那么我们称这种字符串为 ANSI 字符串或者多字节字符串。"中文123"
(占7字节)UNICODE
字符串在内存中,如果“字符”是以在 UNICODE 中的序号存在的,那么我们称这种字符串为 UNICODE 字符串或者宽字节字符串。L"中文123"
(占10字节)由于不同 ANSI 编码所规定的标准是不相同的,因此,对于一个给定的多字节字符串,我们必须知道它采用的是哪一种编码规则,才能够知道它包含了哪些“字符”。而对于 UNICODE 字符串来说,不管在什么环境下,它所代表的“字符”内容总是不变的。
页:
[1]