【转】【编码】ASCII 、UNICODE和UTF-8之二

字符发展

1. 美国

ASCII-(American standard code information interchange) 美国信息互换标准代码

范围:1-127 ; 单字

备注:前部用作控制码,0x20以下的字节状态称为"控制码";后面跟数字,字母大小写至127

2. 美国

ASCII扩展编码

范围:128-255; 单字

备注:很多画表格时需要用下到的横线、竖线、交叉等形状,一直把序号编到了最后一 个状态255

3. 中国GB2312

原由:中国人们得到计算机时,有6000多个常用汉字需要保存呢

规定:一个小于127的字符的意义与原来相同,但两个大于127的字符连在一起时,就表示一个汉字,

前面的一个字节(他称之为高字节)从0xA1用到 0xF7,后面一个字节(低字节)从0xA1到0xFE,

这样我们就可以组合出大约7000多个简体汉字了

范围:0xA1A1~0xF7FE;双字

备注:连在 ASCII 里本来就有的数字、标点、字母都统统重新编了两个字节长的编码,

这就是常说的"全角"字符,而原来在127号以下的那些就叫"半角"字符了

4. 中国GBK

原由:但是中国的汉字太多了,我们很快就就发现有许多人的人名没有办法在这里打出来

规定:于是干脆不再要求低字节一定是127号之后的内码,只要第一个字节是大于127就固定表示这是一个汉字的开始

范围:0xA100~0xFFFF双字

备注:GBK兼容GB2312, 此时20000个新的汉字(包括繁体字)和符号

后来少数民族也要用电脑了,于是我们再扩展,又加了几千个新的少数民族的字,GBK 扩成了GB18030

5. 双字时代

我们看到这一系列汉字编码的标准是好的,于是通称他们叫做 "DBCS"(Double Byte Charecter Set 双字节字符集)

原因:台湾出现BIG5;日本出现了XXX

ISO - (international standard orginaztion) 国际标谁化组织 的出现, 提出规范化编码措施

废除所有地区编码规范,提出统一编码原则

6. UNICODE (Universal Multiple-Octet Coded Character Set",简称 UCS)

规定:于是 ISO 就直接规定必须用两个字节,也就是16位来统一表示所有的字符,

对于ascii里的那些“半角”字符,UNICODE 包持其原编码不变,

只是将其长度由原来的8位扩展为16位,而其他文化和语言的字符则全部重新统一编码。

由于"半角"英文符号只需要用到低8位,所以其高 8位永远是0,

英文文本时会多浪费一倍的空间。

范围:0x0000~0xFFFF双字

备注:他们为了在不同的国家销售同一套软件,

就不得不在区域化软件时也加持那个双字节字符集咒 语,

不仅要处处小心不要搞错,

还要把软件中的文字在不同的字符集中转来转去。UNICODE 对于他们来说是一个很好的一揽子解决方案

,于是从 Windows NT 开始,MS 趁机把它们的操作系统改了一遍,

把所有的核心代码都改成了用 UNICODE 方式工作的版本,

从这时开始,WINDOWS 系统终于无需要加装各种本土语言系统,就可以显示全世界上所有文化的字符了。

UNICODE 在制订时没有考虑与任何一种现有的编码方案保持兼容;

这使得 GBK 与UNICODE 在汉字的内码编排上完全是不一样的,这种转换必须通过查表来进行。

7. 网络数据交换时代

UNICODE -2 (65535) 二字节(简写UCS-2)

UNICODE - 4 (....) 四节节(简写UCS-4)

A)、字符是如何保存在内存中的呢?

在字符或字符串前加L表示后面跟的是UNICODE

wchar_t  wch = L‘1‘;      // 2 bytes, 0x0031

wchar_t* wsz = L"Hello";  // 12 bytes, 6 wide characters

1)、单字节字符串都是字符一一保存,以0结尾。

"Bob" 内存中形式为:

42 6F 62 00

B  o  b  EOS

2)、Big Endian和Little Endian

上面提到了一个字符可能占用多个字节,那么这多个字节在计算机中如何存储呢?比如字符0xabcd,它的存储格式到底是 AB CD,还是 CD AB 呢?

实际上两者都有可能,并分别有不同的名字。如果存储为 AB CD,则称为Big Endian;如果存储为 CD AB,则称为Little Endian。

具体来说,以下这种存储格式为Big Endian,因为值(0xabcd)的高位(0xab)存储在前面:

系统开发者应该对Little-endian和Big-endian模式非常了解。采用Little-endian模式的CPU对操作数的存放方式是 从低字节到高字节,

而Big-endian模式对操作数的存放方式是从高字节到低字节。

例如,16bit宽的数0x1234在Little-endian 模式CPU内存中的存放方式(假设从地址0x4000开始存放)为:

内存地址 0x4000 0x4001

存放内容 0x34 0x12

而在Big-endian模式CPU内存中的存放方式则为:

内存地址 0x4000 0x4001

存放内容 0x12 0x34

32bit宽的数0x12345678在 Little-endian模式CPU内存中的存放方式(假设从地址0x4000开始存放)为:

内存地址 0x4000 0x4001 0x4002 0x4003

存放内容 0x78 0x56 0x34 0x12

而在Big-endian 模式CPU内存中的存放方式则为:

内 存地址 0x4000 0x4001 0x4002 0x4003

存放内容 0x12 0x34 0x56 0x78

3)、任何文字在Unicode中都对应一个值,这个值称为代码点(code point)。

规定存储方式的称为UTF(Unicode Transformation Format),其中应用较多的就是UTF-16和UTF-8了。

UTF-16BE和UTF-16LE不难理解,而UTF-16就需要通过在文件开头以名为BOM(Byte Order Mark)的字符来表明文件是Big Endian还是Little Endian。

BOM为U+FEFF这个字符。

举个例子。“ABC”这三个字符用各种方式编码后的结果如下:

UTF-16BE 00 41 00 42 00 43

UTF-16LE 41 00 42 00 43 00

UTF-16(Big Endian) FE FF 00 41 00 42 00 43

UTF-16(Little Endian) FF FE 41 00 42 00 43 00

UTF-16(不带BOM) 00 41 00 42 00 43

4)、UTF-8

UTF-16和UTF-32的一个缺点就是它们固定使用两个或四个字节,这样在表示纯ASCII文件时会有很多00字节,造成浪费。而RFC3629定义的UTF-8则解决了这个问题。

UTF-8用1~4个字节来表示代码点。表示方式如下:

Unicode是一个字符集,而UTF-8是Unicode的其中一种,Unicode是定长的都为双字节,而UTF-8是可变的,

对于汉字来说Unicode占有的字节比UTF-8占用的字节少1个字节。Unicode为双字节,而UTF-8中汉字占三个字节。

UTF-8编码字符理论上可以最多到6个字节长,然而16位BMP(Basic Multilingual Plane)字符最多只用到3字节长。下面看一下UTF-8编码表:

U-00000000 - U-0000007F: 0xxxxxxx

U-00000080 - U-000007FF: 110xxxxx 10xxxxxx

U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx

U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

时间: 2024-08-13 03:27:41

【转】【编码】ASCII 、UNICODE和UTF-8之二的相关文章

字符编码ASCII, Unicode和UTF-8

字符编码是计算机技术的基石,想要熟练使用计算机,就必须懂得一点字符编码的知识. 1. ASCII码 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串.每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte).也就是说,一个字节一共可以用来表示256种不同的状态,每一个状态对应一个符号,就是256个符号,从0000000到11111111. 上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定

文字编码ASCII,GB2312,GBK,GB18030,UNICODE,UCS,UTF的解析

众所周知,一个文字从输入到显示到存储是有一个固定过程的,其过程为:输入码(根据输入法不同而不同)→机内码(根据语言环境不同而不同,不同的系统语言编码也不一样)→字型码(根据不同的字体而不同)→存储码(根据保存的编码类型不同而不同).不同的存储码之间又有什么异同呢? 一.ASCII系列编码 首先来说明ASCII码(American Standard Code for Information Interchange,美国标准信息交换码),这个编码的时代就久远了,是由美国国家标准局(ANSI)制定,目

【转】【编码】ANSI,ASCII,Unicode,UTF8

不同的国家和地区制定了不同的标准,由此产生了 GB2312.GBK.GB18030.Big5.Shift_JIS 等各自的编码标准.这些使用多个字节来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码.在简体中文Windows操作系统中,ANSI 编码代表 GBK 编码:在繁体中文Windows操作系统中,ANSI编码代表Big5:在日文Windows操作系统中,ANSI 编码代表 Shift_JIS 编码.不同 ANSI 编码之间互不兼容,当信息在国际间交流时,无法将属于两种语言的文字,

聊聊计算机中的编码(Unicode,GBK,ASCII,utf8,utf16,ISO8859-1等)

作为一个程序员,一个中国的程序员,想来“乱码”问题基本上都遇到过,也为之头疼过.出现乱码问题的根本原因是编码与解码使用了不同而且不兼容的“标准”,在国内一般出现在中文的编解码过程中. 我们平时常见的编码有Unicode,GBK,ASCII,utf8,utf16,ISO8859-1等,弄清这些编码之间的关系,就不难理解“乱码”出现的原因以及解决办法. 所谓字符集编码其实就是将字符(包括英文字符.特殊符号,控制字符,数字,汉子等)与计算机中的一个数字(二进制存储)一一对应起来,用这个数字来表示该字符

java中的常用字符编码ASCII、Unicode和UTF-8

首先讲一下几种字符的编码方式: 1. ASCII码 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串.每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte).也就是说,一个字节一共可以用来表示256种不同的状态,每一个状态对应一个符号,就是256个符号,从0000000到11111111. 上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定.这被称为ASCII码,一直沿用至今. ASCI

[转]ASCII UNICODE与UTF-8编码规则及区别

字符编码是计算机技术的基石,想要熟练使用计算机,就必须懂得一点字符编码的知识. 1. ASCII码 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串.每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出 256种状态,这被称为一个字节(byte).也就是说,一个字节一共可以用来表示256种不同的状态,每一个状态对应一个符号,就是256个符号,从 0000000到11111111. 上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一

字符编码 ASCII,Unicode 和 UTF-8 概念扫盲

今天中午,我突然想搞清楚Unicode和UTF-8之间的关系,于是就开始在网上查资料. 结果,这个问题比我想象的复杂,从午饭后一直看到晚上9点,才算初步搞清楚. 下面就是我的笔记,主要用来整理自己的思路.但是,我尽量试图写得通俗易懂,希望能对其他朋友有用.毕竟,字符编码是计算机技术的基石,想要熟练使用计算机,就必须懂得一点字符编码的知识. 1. ASCII码 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串.每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出2

【转】关于字符编码,你所需要知道的(ASCII,Unicode,Utf-8,GB2312…)

转载地址:http://www.imkevinyang.com/2010/06/%E5%85%B3%E4%BA%8E%E5%AD%97%E7%AC%A6%E7%BC%96%E7%A0%81%EF%BC%8C%E4%BD%A0%E6%89%80%E9%9C%80%E8%A6%81%E7%9F%A5%E9%81%93%E7%9A%84.html 字符编码的问题看似很小,经常被技术人员忽视,但是很容易导致一些莫名其妙的问题.这里总结了一下字符编码的一些普及性的知识,希望对大家有所帮助. 还是得从ASC

彻底搞清楚字符编码: ASCII, ISO_8859, GB2312,UCS, Unicode, Utf-8

彻底搞清楚字符编码: ASCII, ISO_8859, GB2312,UCS, Unicode, U 1.ASCII: 0-127(128-255未使用),美国标准 2.IS0-8859-1(latin-1): 0-255, 西欧国家等 3.GB2312:常用简体中文,双字节编码,国标,对于ASCII字符仍采用单字节编码 4.GBK: GB2312的超集,包含繁体,日韩,双字节编码,不是国标(新的国标GB18030-2000是GBK的超集) 5.BIG5:繁体中文,台湾,类似GB2312 6.S

字符编码ASCII,Unicode和UTF-8

http://blog.csdn.net/pipisorry/article/details/42387045 ASCII码 ASCII码一共规定了128个字符的编码,比如空格"SPACE"是32(二进制00100000),大写的字母A是65(二进制01000001).这128个符号(包括32个不能打印出来的控制符号),只占用了一个字节的后面7位,最前面的1位统一规定为0. 非ASCII编码 英语用128个符号编码就够了,但是用来表示其他语言,128个符号是不够的.比如,在法语中,字母