参考资料
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/XP,Linux,Java
|
字符集和编码
字符集:使用哪些字符。也就是说哪些汉字,字母和符号会被收入标准中。所包含“字符”的集合就叫做“字符集”。
编码:规定每个“字符”分别用一个字节还是多个字节存储,用哪些字节来存储,这个规定就叫做“编码”。
各个国家和地区在制定编码标准的时候,“字符的集合”和“编码”一般都是同时制定的。因此,平常我们所说的“字符集”,比如: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-8:Eight-bit UCS Transformation Format,(UCS,Universal Character Set,通用字符集,UCS 是所有其他字符集标准的一个超集)。一个7位的ASCII码值,对应的UTF码是一个字节。如果字符是0x0000,或在0x0080与0x007f之间,对应的UTF码是两个字节,如果字符在0x0800与0xffff之间,对应的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”进行解码。在这个过程中,如果A和B不一样,就会出现乱码。
要想正确显示,则要先将“二进制字节串”按照“字符集编码B”编码为“二进制字节串”(字符集A的码值),然后按照“字符集编码A”对“二进制字节串”进行解码。
分享到:
相关推荐
小巧实用的字符编码解码工具, 实用小巧。编码。解码。编码解码
那什么是字符呢?在计算机领域,我们把诸如文字、标点符号...这就涉及到字符编码的概念了,比如一个字符集有 8 个字符,那么用 3 个二进制位就可以完全表示该字符集的所有字符,也即每个字符用 3 个二进制位进行编码。
用于对字符串进行编码和解码,只需要输出字符串或者编码后的文件便可以实现操作。
通过查询文件中的字符以及各个字符的权值(出现次数),对某个字符串进行哈夫曼编码和解码,代码则会通过生成哈夫曼二叉树计算出各个字符的编码,存在一个文件中,这时输入要编码的字符串就可以得到其哈夫曼编码,还...
假设编码字符串是“Walrus”,需要编码的文本是“Meet me in St. Louis”,则:我们在待编码的文本之上重复书写上述编码字符串,使得编码字符串的长度与待编码文本的长度相同, WalrusWalrusWalrusWa Meet me in St....
主要介绍了java 使用 URLDecoder 和 URLEncoder 对中文字符进行编码和解码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
本文对于如何实现这一编码和解码进行了描述,并给出了它们的C语言实现过程。
字符集与字符集编码简介 我们知道,计算机只能识别诸如0101这样的二进制数,于是人们必须以二进制数据与计算机进行交互,或者先将人类使用的字符按一定规则转换为二进制数。 那什么是字符呢?在计算机领域,我们把...
纯js对字符串进行gb2312编码解码,如“中国”编码后成为:“%D6%D0%B9%FA”,很好用的
Java字符集和编码 ,Java字符集和编码Java字符集和编码
java的TLV包的编码和解码,能够对Tag Length Value对应的值进行编码和解码。包内包含jar包和源码包,还有一个java写的带有详细注释的Demo
C# Encoder 与 Decoder的例子,详细注释。 Encoder Decoder 编码 解码 C# Encoder Decoder 编码 解码 C# Encoder Decoder 编码 解码 C# Encoder Decoder 编码 解码 C#
字符集和编码, 原来是这样
字符集编码问题字符集编码问题字符集编码问题
这个进行字符串加密 和解密 , 编码和 解码 包括(base64、DES、AES、SHA-1、MD5 ) ,都是亲测的,保证可用 这个进行字符串加密 和解密 , 编码和 解码 包括(base64、DES、AES、SHA-1、MD5 ) ,都是亲测的,保证...
文档中主要介绍了各类字符集以及相关的字符编码,字符的显示原理,从输入到显现的整个过程,程序中出现的乱码问题以及解决方案
使用JUnit测试字符串的编码与解码,里面包含UTF8(英文) 和UTF16(中文)的编码与解码
标准的现代维吾尔文字符集unicode编码表
字符编解码的故事 -详细介绍字符编码 解码的历史渊源 ,很有意思哦
主要介绍了PHP安全的URL字符串base64编码和解码,在base64的基础上替换了不安全的一些字符,需要的朋友可以参考下