摘要:介绍了字符与编码的发展过程,相关概念。举例Java实际应用中,编码的实现方法。最后,讲述了通常对字符与编码的几种误解,由于这些误解而导致乱码产生的原因,以及消除乱码的方法。
1.编码问题的由来及相关概念
1.1字符与编码的发展
从计算机对多国语言的支持角度看,大致可以分为三个阶段:
系统内码 | 说明 | 系统 | |
阶段一 | ASCII | 计算机刚开始只支持英语,其它语言不能够在计算机上存储和显示 | 英文DOS |
阶段二 | ANSI编码(本地化) |
为使计算机支持更多语言,通常使用0x80~0xFF范围的2个字节来表示1个字符。比如:汉字‘中’在中文操作系统中,使用[0x06,0xD0]这两个字节存储。 不同的国家和地区制定了不同的标准,由此产生了GB2312、BIG5、JIS等各自编码标准。这些使用2个字节来代表一个字节来代表一个字符的各种汉字延伸编码方式,成为ANSI编码。在简单中文系统下,ASNI编码代表GB2312编码,在日文操作系统下,ANSI编码代表JIS编码。 不同ANSI编码之间互不兼容,当信息在国际间交流时,无法将属于两种语言的文字,存储在同一段ANSI编码的文本中。 |
中文DOS,中文Windows95/98,日文Windows95/98 |
阶段三 | UNICODE(国际化) | 为了使国际间信息交流更加方便,国际组织制定了UNICODE字符集,为各种语言中的每一个字符设定了统一并且唯一的数字编号,以满足跨语言、跨平台进行文本转换、处理的要求。 | Windows NT/2000/XP,Linux,Java |
字符串在内存中的存放方法:
在ASCII阶段,单字节字符串使用一个字节(SBCS)存放一个字符。比如‘Tom1988’在内存中为:
44 | 6F | 6D | 31 | 39 | 38 | 38 | 00 |
T | o | m | 1 | 9 | 9 | 8 |