`

字符、字符集,编码和解码学习笔记

阅读更多

参考资料

http://www.regexlab.com/zh/encoding.htm

字符与编码的发展

 

系统内码

说明

系统

阶段一

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

字符集和编码

字符集:使用哪些字符。也就是说哪些汉字,字母和符号会被收入标准中。所包含字符的集合就叫做字符集

编码:规定每个字符分别用一个字节还是多个字节存储,用哪些字节来存储,这个规定就叫做编码

各个国家和地区在制定编码标准的时候,字符的集合编码一般都是同时制定的。因此,平常我们所说的字符集,比如:GB2312, GBK, JIS 等,除了有字符的集合这层含义外,同时也包含了编码的含义。

常用的编码简介

分类

编码标准

说明

单字节字符编码

ASCII

(American Standard Code for Information Interchange,美国信息互换标准代码),是基于常用的英文字符的一套电脑编码系统。我们知道英文中经常使用的字符、数字符号被计算机处理时都是以二进制码的形式出现的。这种二进制码的集合就是所谓的ASCII码。

单字节字符编码

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 字符可能转化成一个字节或多个字节。
这是一种通用的字符集,对所有语言的文字进行了统一编码,对每一个字符都用2个字节来表示,对于英文字符采取前面加“0”字节的策略实现等长兼容。


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

UNICODE 编码对于英文都采用两个字节进行表示,在网络传输过程中会加大数据量。

UTF-8Eight-bit UCS Transformation Format(UCSUniversal Character Set,通用字符集,UCS 是所有其他字符集标准的一个超集)。一个7位的ASCII码值,对应的UTF码是一个字节。如果字符是0x0000,或在0x00800x007f之间,对应的UTF码是两个字节,如果字符在0x08000xffff之间,对应的UTF码是三个字节。(中文用UTF表示是三个字节,英语是一个字节

程序中的字符与字节

类型或操作

Java

C++

字符

char

wchar_t

字节

byte

char

ANSI 字符串

byte[]

char[]

UNICODE 字符串

String

wchar_t[]

字节串字符串

string = new String(bytes, "encoding")

mbstowcs(), MultiByteToWideChar()

字符串字节串

bytes = string.getBytes("encoding")

wcstombs(), WideCharToMultiByte()

编码和解码

编码:把字符转化成字节

解码:把字节转化成字符

字符串String在传输过程中,先按传送者本地“字符集编码A”自动编码为本地字符集“码值”(二进制字节串),然后进行传输。接收者接收到“二进制字节串”后,自动按照接收者的本地“字符集编码B”进行解码。在这个过程中,如果AB不一样,就会出现乱码。

要想正确显示,则要先将“二进制字节串”按照“字符集编码B”编码为“二进制字节串”(字符集A的码值),然后按照“字符集编码A”对“二进制字节串”进行解码。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics