字符,字节和编码

来源:我想网 时间:2009-12-09 15:59:00 

摘要:本文介绍了字符与编码的发展过程,相关概念的正确理解。举例说明了一些实际应用中,编码的实现方法。然后,本文讲述了通常对字符与编码的几种误解,由于这些误解而导致乱码产生的原因,以及消除乱码的办法。本文的内容涵盖了“中文问题”,“乱码问题”。

掌握编码问题的关键是正确地理解相关概念,编码所涉及的技术其实是很简单的。因此,阅读本文时需要慢读多想,多思考。


引言

“字符与编码”是一个被经常讨论的话题。即使这样,时常出现的乱码仍然困扰着大家。虽然我们有很多的办法可以用来消除乱码,但我们并不一定理解这些办法的内在 原理。而有的乱码产生的原因,实际上由于底层代码本身有问题所导致的。因此,不仅是初学者会对字符编码感到模糊,有的底层开发人员同样对字符编码缺乏准确 的理解。

1. 编码问题的由来,相关概念的理解

1.1 字符与编码的发展

从计算机对多国语言的支持角度看,大致可以分为三个阶段:


系统内码说明系统
阶段一ASCII计算机刚开始只支持英语,其它语言不能够在计算机上存储和显示。英文 DOS
阶段二ANSI编码
(本地化)
为使计算机支持更多语言,通常使用 0×80~0xFF 范围的 2 个字节来表示 1 个字符。比如:汉字 ‘中’ 在中文操作系统中,使用 [0xD6,0xD0] 这两个字节存储。


不同的国家和地区制定了不同的标准,由此产生了 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″ 在内存中为:

426F6231323300
Bob123\0

在使用 ANSI 编码支持多种语言阶段,每个字符使用一个字节或多个字节来表示(MBCS),因此,这种方式存放的字符也被称作多字节字符。比如,”中文123″ 在中文 Windows 95 内存中为7个字节,每个汉字占2个字节,每个英文和数字字符占1个字节:

D6D0CEC431323300
123\0

在 UNICODE 被采用之后,计算机存放字符串时,改为存放每个字符在 UNICODE 字符集中的序号。目前计算机一般使用 2 个字节(16 位)来存放一个序号(DBCS),因此,这种方式存放的字符也被称作宽字节字符。比如,字符串 “中文123″ 在 Windows 2000 下,内存中实际存放的是 5 个序号:

2D4E87653100320033000000← 在 x86 CPU 中,低字节在前
123\0

一共占 10 个字节。

标签:字符,编码,乱码,字节
0
投稿

猜你喜欢

  • 设计与用户体验

    2009-05-06 13:36:00
  • 修正IE6不支持position:fixed的bug[译]

    2009-08-01 12:44:00
  • 简单代码实现可输入的下拉框功能(select)

    2008-10-20 19:52:00
  • 初衷和结果

    2009-02-23 12:52:00
  • SQLServer 跨库查询实现方法

    2012-04-13 12:07:09
  • js正则的几个基本概念

    2007-09-30 20:02:00
  • ORACLE 分区表的设计

    2009-08-15 10:56:00
  • MySQL 基本概念

    2011-09-10 16:22:34
  • 实现UTF8转换GB2312国标码的asp代码

    2011-02-28 10:53:00
  • js编写的语法高亮引擎工具

    2008-05-25 13:27:00
  • 如何清除Vbscript惹出来的中文乱码?

    2010-01-18 20:50:00
  • DWCS3-CSS布局之二CSS规则定义

    2008-06-16 13:36:00
  • 小诀窍让你快速上手Dreamweaver

    2007-12-03 11:35:00
  • 不要放弃使用CSS中的新技术

    2009-05-15 12:49:00
  • 关于Javascript的内存泄漏问题

    2008-04-15 07:46:00
  • javascript获取来源的URL代码

    2009-02-25 12:36:00
  • 利用XMLHTTP检测网址及探测服务器类型

    2009-04-24 15:12:00
  • 让SQL Server数据库自动执行管理任务(一)

    2009-03-20 10:35:00
  • JS+ASP实现无刷新新闻列表方法

    2007-08-22 12:44:00
  • 在SQL Server 2005数据库中进行错误捕捉

    2008-12-02 14:39:00
  • asp之家 网络编程 m.aspxhome.com