ASCII和万国码

什么是ASCII

计算机的起初是使用内存中的0101来表示数和机器码。如何用内存中的bit来表示文本一直困扰着人们,毕竟人类主要的信息展示是文字,而不是苦涩的0101。后来ASCII码的发明成功的解决了“部分”问题。说白了ASCII码就是解决了一个以数字形式表示文本的问题。

ASCII码全称为美国信息交换标准码“American Standard Code for Information Interchange”。目前它已被国际标准化组织(ISO)定为国际标准,称为ISO 646标准。适用于所有拉丁文字字母,ASCII码有7位码和8位码两种形式。在计算机的存储单元中,一个ASCII码值占一个字节(8个二进制位)

7位ASCII码是用七位二进制数进行编码的,可以表示128个字符。其最高位(b7)用作奇偶校验位。所谓奇偶校验,是指在代码传送过程中用来检验是否出现错误的一种方法,一般分奇校验和偶校验两种。奇校验规定:正确的代码一个字节中1的个数必须是奇数,若非奇数,则在最高位b7添1;偶校验规定:正确的代码一个字节中1的个数必须是偶数,若非偶数,则在最高位b7添1。

第0~32号及第127号(共34个)是控制字符或通讯专用字符,如控制符:LF(换行)、CR(回车)、FF(换页)、DEL(删除)、BEL(振铃)等;通讯专用字符:SOH(文头)、EOT(文尾)、ACK(确认)等;

第33~126号(共94个)是字符,其中第48~57号为0~9十个阿拉伯数字;65~90号为26个大写英文字母,97~122号为26个小写英文字母,其余为一些标点符号、运算符号等。

让我们到幕后去看看,看看ASCII码是如何以数字形式表示文本的。举2个例子:

如ASCII码‘A‘ -- 其内存存储字节2进制表示为"01000001" --- 其16进制值为0x41 --- 其10进制值为65(这里的值实际上是‘A‘在ASCII码表中编号);

验证过程:

char c = ‘A‘;

printf("%c\n", c);

printf("%x\n", c);

printf("%d\n", c);

又如 ASCII码‘6‘ -- 其内存存储字节2进制表示为"00110110" --- 其16进制值为0x36 --- 其10进制值为54(这里的值实际上是‘6‘在ASCII码表中的编号);

验证过程:

char c = ‘6‘;

printf("%c\n", c);

printf("%x\n", c);

printf("%d\n", c);

一个字符串在内存中就是按照逐个字符的ASCII码连续存放的,我们在传送字符串时一般无需做特殊转换。

FTP协议中有两种通讯方式,其中一种是ASCII码方式,即文本方式)这里也举例说明:比如我们要传送数值123, 123数值用16进制表示为0x7b,以二进制表示为01111011,那么以二进制方式通讯,01111011就是我们真实传送的数据,但是如果以ASCII码方式通讯,则完全不同了,如果你还传送01111011的话,对方那边的得到的将是‘{‘(‘{‘对应的ASCII码用16进制表示为7b)。正确的方式就是将123每位上的数字转化为其相应的ASCII码,然后传送。这里‘1‘、‘2‘和‘3‘对应的ASCII码用16进制表示分别为0x31、0x32和0x33。这样组合起来后要传送的数据应为"001100010011001000110011"。

什么是UNICODE

Unicode码也是一种国际标准编码,采用二个字节编码,与ANSI码不兼容,对于ASCII字符它也使用两字节表示。

起初都是用ASCII码来表示字符。这些字符可以是字母。数字。标点符号和控制符。用这种编码来表示英文在内的字符不成问题的。但要表示其它语言文字如。阿拉伯文。中文。日文。维文。哈文…必须进行扩充

对于中文而言,则必须使用两个字节(byte)来代表一个字符,具第一个字节必须大于127(所以我们有许程序判断中文都是以ascii码大于127作为条件)。以上用两个字节来表示一个中文的方式,在习惯上称为双字节(即DBCS: Double-Byte Character Set),而相对之下,英文的字符码就称为单字节SBCS(Single-Byte Character Set)。

虽然双字节(DBCS)足以解决中英文字符混合使用情况,但对于不同字符系统而言,必须经过字符码转换,非常麻烦。例如:中英文混合情况等。为解决这个问题,国际标准组织于1984年4月成立ISO/IEC JTC1/SC2/WG2工作组。针对各国文字、符号进行统一性编码。1991年美国跨国公司成立Unicode Consortium。并于1991年10月与WG2达成协议。采用同一编码字集。目前Unicode是采用16位编码体系。其字符集内容与ISO10646的BMP(Basic Multilingual Plane)相同。Unicode于1992年6月通过DIS(Draf International Standard)。目前版本V2.0于1996公布。内容包含符号6811个。汉字20902个。韩文拼音11172个。造字区6400个。保留20249个。共计65534个。

UNICODE同现在流行的代码页最显著不同点在于:UNICODE是两字节的全编码。对于ASCII字符它也使用两字节表示。代码页是通过高字节的取值范围来确定是ASCII字符。还是汉字的高字节。如果发生数据损坏。某处内容破坏。则会引起其后汉字的混乱。UNICODE则一律使用两个字节表示一个字符。最明显的好处是它简化了汉字的处理过程。

Unicode的最初目标。是用1个16位的编码来为超过65000字符提供映射。但这还不够。它不能覆盖全部历史上的文字。也不能解决传输的问题(implantation head-ache‘s)。尤其在那些基于网络的应用中。因此。Unicode用一些基本的保留字符制定了三套编码方式。它们分别是UTF-8,UTF-16和UTF-32。正如名字所示。在UTF-8中。字符是以8位序列来编码的。用一个或几个字节来表示一个字符。这种方式的最大好处。是UTF-8保留了ASCII字符的编码做为它的一部分。例如。在UTF-8和ASCII中。“A”的编码都是0x41.UTF-16和UTF-32分别是Unicode的16位和32位编码方式。考虑到最初的目的。通常说的Unicode就是指UTF-16。

Unicode的特点是:

不管哪一国的字符码均以两个Byte表示,例如"A"在Unicode则是16进制 41和00的组合,即4100,高位41(转换为Ascii码即是65=A),Windows NT/2000以Unicode来表示字符集,例如你可以看到MS SQL Server中产生的SQL文件可以选择是以Unicode来保存还是以普通格式来保存,如果你以Unicode保存,则在95/98平台许多软件均无法正确读出其格式。

同时你还可以注意到95/98中API定义,许多名称结尾是有一个A的,例如 WriteProfileStringA

而在NT/2000操作系统中,提供了两套API,另外一个命令是WriteProfileStringW,以W 结尾的API只适用于NT / 2000。(在NT中使用以W结尾的API函数效率比A结尾的要快,因为省去了Unicode和DBCS/SBCS的转换过程)

这样我们经常要用到的判断字符串长度的函数,在NT和95/98下执行结果不同,如下

95/98中: len("abc中国") 返回 7 (因为每个中文作为两个Ascii码来看)

NT/2000中: len("abc中国") 返回 5 (因为每个字符都作为一个Unicode来看)

时间: 2024-10-05 23:25:48

ASCII和万国码的相关文章

Unicode(统一码、万国码、单一码)

Unicode(统一码.万国码.单一码)是一种在计算机上使用的字符编码.它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言.跨平台进行文本转换.处理的要求.1990年开始研发,1994年正式公布.随着计算机工作能力的增强,Unicode也在面世以来的十多年里得到普及. Unicode的编码和实现 大概来说,Unicode编码系统可分为编码方式和实现方式两个层次. 1.编码方式 Unicode的编码方式与ISO10646的通用字元集(亦称[通用字符集])(Universal Ch

中文编码及万国码

字符编码支持中文的第一张表就叫 GB2312 1980 GB2312 6700+1995 GBK1.0 200002000 GB18030 27000 big5 台湾 unicode 万国码  支持所有国家和地区的编码 2^16 = 65536 = 存一个字符 统一占用2个字节 UTF-8 = unicode的扩展集,可变长的字符编码集 Assic --> GB2312 --> GBK1.0 --> GB18030 Assic --> unicode -->utf-8/utf

关于excel导入手机号提取时被自动加上多余空万国码的问题

//去除excel粘贴自动加上的空万国码“\U202d” "U202c" //去除excel粘贴自动加上的空万国码“\U202d” "U202c" String mobiletemp=messageSendUser.getMobile(); String mobiletemp2=""; if(mobiletemp!=null && !"".equals(mobiletemp)){ for (int i=0;i&

初学者-ASCII码

var index=1; var byt = new byte[1] {(byte) (index + 64)}; var grade = Encoding.ASCII.GetString(byt); 1转换为a; 在百度上面查询时很多知识纯粹的ASCII对应的码值转换,初学者如果少加了64就一直会得不到正确的数据

vc 文字转换到机内码,输入汉字和数字, 输出一串16进制码(数字-〉ASII码,汉字—〉国标码)

// 可以用,此程序实现的是是文字转换到机内码.机内码=国标码+8080H,不过学习了. //此程序是利用汉字在机器内输出就是机内码的原理,直接保存的,其实挺简单. //输入一串汉字和数字的混合字符, 经过程序转换, 对应输出一串16进制码(数字-〉ASII码,汉字—〉国标码) CString temp; GetDlgItemText(IDC_EDIT1,m_hanzi);//将汉字保存到变量m_hanzi unsigned char *b=new unsigned char[m_hanzi.G

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

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

关于ASCII、GB231、GBK、UTF-8/UTF8、ANSI、unicode的学习笔记

继续上次的学习内容,写一些自己学习的笔记吧!总是觉得没有笔记的学习总是不那么踏实,我承认自己是个记忆力很差的人,特别羡慕那些可以把自己学过的东西记得很牢靠的人.哎!可惜我不是,那只能做出来点东西,就算以后忘了,回过头来可以看一看,有东西查:毕竟是自己亲手打出来的一个一个字啊 已经一万六千字了!嘿嘿...继续加油! 今天公司网络有问题,说是让在家里上班,skype在线就行了.结果我这自觉性不够,就打酱油了!还是继续学习我的mysql吧!我是刚毕业的大学生,学的和写的都是一些最基础的,如果巧遇大牛,

python的 随手记----字符编码与转码

一.前提 那么到底什么是编码呢? //ASCII 记住一句话:计算机中的所有数据,不论是文字.图片.视频.还是音频文件,本质上最终都是按照类似 01010101 的二进制存储的. 再说简单点,计算机只懂二进制数字! 所以,目的明确了:如何将我们能识别的符号唯一的与一组二进制数字对应上?于是美利坚的同志想到通过一个电平的高低状态来代指0或1, 八个电平做为一组就可以表示出 256种不同状态,每种状态就唯一对应一个字符,比如A--->00010001,而英文只有26个字符,算上一些特殊字符和数字,1

python中,ascii,unicode,utf8,gbk之间的关系梳理

在计算机中,经常遇到编码问题,本节主要梳理下ascii,unicode,utf8,gbk 这几种编码之间的关系. ASCII 计算机中,所有数据都以0和1来表示.在一开始的时候,要表示的内容比较少,人们使用了ascii编码的方式来编码. ASCII(American Standard Code for Information Interchange,美国标准信息交换代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言,其最多只能用 8 位来表示(一个字节),即:2**8 -