字符及编码:计算机只是处理数字。它们指定一个数字,来储存字母或其他字符。
 
 
什么是字符、字节及字符串:
 
概念描述
举例
字符
人们使用的记号,抽象意义上的一个符号。
'1', '', 'a', '$', '', ……
字节
计算机中存储数据的单元,一个8位的二进制数,是一个很具体的存储空间。
0x01, 0x45, 0xFA, ……
ANSI
字符串
在内存中,如果字符是以 ANSI 编码形式存在的,一个字符可能使用一个字节或多个字节来表示,那么我们称这种字符串为 ANSI 字符串或者多字节字符串
"中文123"
(占7字节)
UNICODE
字符串
在内存中,如果字符是以在 UNICODE 中的序号存在的,那么我们称这种字符串为 UNICODE 字符串或者宽字节字符串
L"中文123"
(占10字节)
 
从计算机对多国语言的支持角度看,大致可以分为三个阶段:
 
系统内码
说明
系统
阶段一
ASCII
计算机刚开始只支持英语,其它语言不能够在计算机上存储和显示。
英文 DOS
阶段二
ANSI编码
(本地化)
为使计算机支持更多语言,通常使用 0x80~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/XPLinuxJava
 
ASCII 阶段,单字节字符串使用一个字节存放一个字符(SBCS)。在使用 ANSI 编码支持多种语言阶段,每个字符使用一个字节或多个字节来表示(MBCS),因此,这种方式存放的字符也被称作多字节字符。 UNICODE 被采用之后,计算机存放字符串时,改为存放每个字符在 UNICODE 字符集中的序号。目前计算机一般使用 2 个字节(16 位)来存放一个序号(DBCS),因此,这种方式存放的字符也被称作宽字节字符
 
各个国家和地区所制定的不同 ANSI 编码标准中,都只规定了各自语言所需的字符。比如:汉字标准(GB2312)中没有规定韩国语字符怎样存储。这些 ANSI 编码标准所规定的内容包含两层含义:
  1. 使用哪些字符。也就是说哪些汉字,字母和符号会被收入标准中。所包含字符的集合就叫做字符集
  2. 规定每个字符分别用一个字节还是多个字节存储,用哪些字节来存储,这个规定就叫做编码
各个国家和地区在制定编码标准的时候,字符的集合编码一般都是同时制定的。因此,平常我们所说的字符集,比如:GB2312, GBK, JIS 等,除了有字符的集合这层含义外,同时也包含了编码的含义。
 
UNICODE 字符集包含了各种语言中使用到的所有字符。用来给 UNICODE 字符集编码的标准有很多种,比如:UTF-8, UTF-7, UTF-16, UnicodeLittle, UnicodeBig 等。
 
分类
编码标准
说明
单字节字符编码
ISO-8859-1
最简单的编码规则,每一个字节直接作为一个 UNICODE 字符。比如,[0xD6, 0xD0] 这两个字节,通过 iso-8859-1 转化为字符串时,将直接得到 [0x00D6, 0x00D0] 两个 UNICODE 字符,即 "ÖÐ"

反之,将 UNICODE 字符串通过 iso-8859-1 转化为字节串时,只能正常转化 0~255 范围的字符。
ANSI 编码
GB2312,
BIG5,
Shift_JIS,
ISO-8859-2 ……
UNICODE 字符串通过 ANSI 编码转化为字节串时,根据各自编码的规定,一个 UNICODE 字符可能转化成一个字节或多个字节。

反之,将字节串转化成字符串时,也可能多个字节转化成一个字符。比如,[0xD6, 0xD0] 这两个字节,通过 GB2312 转化为字符串时,将得到 [0x4E2D] 一个字符,即 '' 字。

“ANSI
编码的特点:
1.
这些“ANSI 编码标准都只能处理各自语言范围之内的 UNICODE 字符。
2. “UNICODE
字符转换出来的字节之间的关系是人为规定的。
UNICODE 编码
UTF-8,
UTF-16, UnicodeBig ……
“ANSI 编码类似的,把字符串通过 UNICODE 编码转化成字节串时,一个 UNICODE 字符可能转化成一个字节或多个字节。

“ANSI 编码不同的是:
1.
这些“UNICODE 编码能够处理所有的 UNICODE 字符。
2. “UNICODE
字符转换出来的字节之间是可以通过计算得到的。