关于字符编码,你所需要知道的
计算机字符编码
计算机字符编码⼀、有关编码的基础知识 1、计算机中存储单位位 bit 最⼩的单元字节 byte 机器语⾔的单位 1byte=8bits1KB = 1024byte2MB = 1024KB1GB = 1024MB 2、进制⼆进制 binary⼋进制 octal⼗进制 decimal⼗六进制 hex 3、⼏个概念 (1)字符:是各种⽂字和符号的总称,包括各个国家的⽂字,标点符号,图形符号,数字等; (2)字符集:字符集是多个符号的集合,每个字符集包含的字符个数不同。
(3)字符编码:字符集只是规定了有哪些字符,⽽最终决定采⽤哪些字符,每⼀个字符⽤多少字节表⽰等问题,则是由编码来决定的。
计算机要准确的处理各种字符集⽂字,需要进⾏字符编码,以便计算机能够识别和存储各种⽂字。
⼆、字符编码的介绍⾸先来看⼀下常⽤的编码有哪些,截图⾃Notepad++。
其中ANSI在中国⼤陆即为GBK(以前是GB2312),最常⽤的是 GBK 和 UTF8⽆BOM 编码格式。
后⾯三个都是有BOM头的⽂本格式,UCS-2即为⼈们常说的Unicode编码,⼜分为⼤端、⼩端。
所谓BOM头(Byte Order Mark)就是⽂本⽂件中开始的⼏个并不表⽰任何字符的字节,⽤⼆进制编辑器(如bz.exe)就能看到了。
UTF8的BOM头为 0xEF 0xBB 0xBFUnicode⼤端模式为 0xFE 0xFFUnicode⼩端模式为 0xFF 0xFE 如图: ⼆、编码表的由来 计算机只能识别⼆进制数据,早期由来是电信号。
为了⽅便应⽤计算机,让它可以识别各个国家的⽂字。
就将各个国家的⽂字⽤数字来表⽰,并⼀⼀对应,形成⼀张表。
这就是编码表。
⼆、ASCII码 计算机⼀开始发明的时候是⽤来解决数字计算的问题,后来⼈们发现,计算机还可以做更多的事,例如⽂本处理。
但由于计算机只识“数”,因此⼈们必须告诉计算机哪个数字来代表哪个特定字符,例如65代表字母‘A’,66代表字母‘B’,以此类推。
字符编码
1、什么是字符编码,为什么要字符编码?2、区分“字符集”和“编码”3、几种常用的字符编码。
首先介绍一下拉丁字母:拉丁字母,也叨罗马字母,是当仂丐界上使用最广的字母系统。
拉丁字母,戒者说基本的拉丁字母,就是你所常见的到的ABCD 等26 个英文字母。
原先是欧洲那边使用的,后来由亍欧洲殖民主义,导致后来的美洲等地,也是用的这套字母体系。
而其他有些地方,比如越南等,本来有自己的文字语言的,结果受西斱文化的影响和由亍基督教的传播,也用拉丁字母了。
所以总的说,现在欧洲多数国家,美洲,澳洲,非洲的多数国家,都是用的拉丁字母,即你所常见的英文字母,也是拉丁字母。
而中国的汉语拼音,也是用的这个拉丁字母。
那字符编码是什么?计算机中存放的都是0 和1 的二进制值。
8 个位对应一个字节,常用16 迚制来表示。
而我们普通用户所希望看到的是,计算机把其所存储的对应的16 迚制的数值,转化为对应的字符,包括英文和中文等其他语言的字符,然后输出到屏幕上。
而所谓编码,就是,定义了一套规则,去指定,哪些数值,对应着哪些字符。
举个最简单的例子,常见65=0x41 对应的是大写字母A,97=0x61 对应的是小写字母a,而这套数值和字母之间的映射兰系,说白了,就是一套规则,就叫做字符编码,即我们常说的ASCII 编码。
所以字符编码就是:定义了一套规则,指定了计算机中存放的这么多值中的哪个值,对应了电脑屏幕显示出来的哪个字母。
区分一下“字符集”和“编码”使用哪些字符。
也就是说哪些汉字,字母和符号会被收入标准中。
所包含“字符”的集合就叫做“字符集”。
规定每个“字符”分别用一个字节还是多个字节存储,用哪些字节来存储,这个规定就叫做“编码”。
各个国家和地区在制定编码标准的时候,“字符的集合”和“编码”一般都是同时制定的。
因此,平常我们所说的“字符集”,比如:GB2312, GBK, JIS 等,除了有“字符的集合”这层含义外,同时也包含了“编码”的含义。
各种文字编码简介+常见的编码都有介绍
各种文字编码简介ASCIIASCII码是7位编码,编码范围是0×00-0×7F。
ASCII字符集包括英文字母、阿拉伯数字和标点符号等字符。
其中0×00-0×20和0×7F共33个控制字符。
只支持ASCII码的系统会忽略每个字节的最高位,只认为低7位是有效位。
HZ字符编码就是早期为了在只支持7位ASCII系统中传输中文而设计的编码。
早期很多邮件系统也只支持ASCII编码,为了传输中文邮件必须使用BASE64或者其他编码方式。
GB2312GB2312是基于区位码设计的,区位码把编码表分为94个区,每个区对应94个位,每个字符的区号和位号组合起来就是该汉字的区位码。
区位码一般用10进制数来表示,如1601就表示16区1位,对应的字符是“啊”。
在区位码的区号和位号上分别加上0xA0就得到了GB2312编码。
区位码中01-09区是符号、数字区,16-87区是汉字区,10-15和88-94是未定义的空白区。
它将收录的汉字分成两级:第一级是常用汉字计3755个,置于16-55区,按汉语拼音字母/笔形顺序排列;第二级汉字是次常用汉字计3008个,置于56-87区,按部首/笔画顺序排列。
一级汉字是按照拼音排序的,这个就可以得到某个拼音在一级汉字区位中的范围,很多根据汉字可以得到拼音的程序就是根据这个原理编写的。
GB2312字符集中除常用简体汉字字符外还包括希腊字母、日文平假名及片假名字母、俄语西里尔字母等字符,未收录繁体中文汉字和一些生僻字。
可以用繁体汉字测试某些系统是不是只支持GB2312编码。
GB2312的编码范围是0xA1A1-0×7E7E,去掉未定义的区域之后可以理解为实际编码范围是0xA1A1-0xF7FE。
EUC-CN可以理解为GB2312的别名,和GB2312完全相同。
区位码更应该认为是字符集的定义,定义了所收录的字符和字符位置,而GB2312及EUC-CN是实际计算机环境中支持这种字符集的编码。
1编码规则及分类指导
1编码规则及分类指导编码规则是为了规范和统一信息的表示和传输而制定的一系列规则。
编码规则的分类指导可以根据不同的编码目的和应用场景进行划分。
本文将介绍一些常见的编码规则及分类指导。
一、字符编码规则字符编码规则是将字符映射为二进制数的一种规则。
常见的字符编码规则有ASCII码、Unicode和UTF-8等。
1. ASCII码:ASCII(American Standard Code for Information Interchange)是最早的字符编码规则,它使用7位二进制数来表示128个字符,包括英文字母、数字、标点符号以及一些控制字符。
ASCII码只能表示英文字符,对于其他语言的文字则不支持。
2. Unicode:Unicode是一种更为通用的字符编码规则,它支持全球各种语言字符的表示。
Unicode使用整数来表示字符,为每个字符分配一个唯一的码点(code point),从而避免了字符在不同系统中的不一致性。
Unicode有多种实现形式,其中UTF-8和UTF-16应用较广泛。
3. UTF-8:UTF-8是一种实现Unicode的编码规则。
UTF-8使用一至四个字节来表示一个字符,根据字符所在的范围分配不同长度的编码。
对于英文字符,UTF-8与ASCII码兼容,即使用相同的编码。
UTF-8在网络传输和存储中广泛应用,因为它可以节省空间。
二、数值编码规则数值编码规则是将数值映射为二进制数的一种规则。
常见的数值编码规则有二进制、十进制和小数定点表示法等。
1.二进制编码:二进制编码是将数值表示为二进制数的一种规则。
二进制编码非常简单,只由0和1两个数字组成,适合计算机内部的数据表示。
在数字传输和储存中,常通过二进制编码来表示各种数值。
2.十进制编码:十进制编码是我们日常生活中最常用的表示数值的方式。
十进制编码使用0-9十个数字来表示数值,以10作为基数。
十进制编码适合人类理解和使用,但在计算机内部需要转为二进制来进行计算。
编码的基础知识
编码的基础知识编码是用预先规定的方法将文字、数字或其他对象编成数码,或将信息、数据转换成规定的电脉冲信号。
编码知识你知道多少呢?以下是由店铺整理关于编码的知识,希望大家喜欢!编码的定义编码是根据一定的协议或格式把模拟信息转换成比特流的过程。
在计算机硬件中,编码(coding)是在一个主题或单元上为数据存储,管理和分析的目的而转换信息为编码值(典型地如数字)的过程。
在软件中,编码意味着逻辑地使用一个特定的语言如C或C++来执行一个程序。
在密码学中,编码是指在编码或密码中写的行为。
将数据转换为代码或编码字符,并能译为原数据形式。
是计算机书写指令的过程,程序设计中的一部分。
在地图自动制图中,按一定规则用数字与字母表示地图内容的过程,通过编码,使计算机能识别地图的各地理要素。
n位二进制数可以组合成2的n次方个不同的信息,给每个信息规定一个具体码组,这种过程也叫编码。
编码的简介GB编码标准中,比较常用的是GB2312和GBK两种,GB2312是GBK的一个子集,GB2312编码范围是 0xA1A1 - 0xFEFE ,如果纯粹的 GB2312编码,处理起来是十分简单的,但处理GBK字符集时有些小的提示,先说说GBK编码的标准吧:GBK 采用双字节表示,总体编码范围为8140-FEFE,首字节在81-FE 之间,尾字节在 40-FE 之间,剔除 xx7F 一条线。
总计 23940 个码位,共收入21886 个汉字和图形符号,其中汉字(包括部首和构件)21003 个,图形符号 883 个。
编码的分类1. 汉字区。
包括:a. GB 2312 汉字区。
即 GBK/2: B0A1-F7FE。
收录 GB 2312 汉字6763 个,按原顺序排列。
b. GB 13000.1 扩充汉字区。
包括:(1) GBK/3: 8140-A0FE。
收录 GB 13000.1 中的 CJK 汉字 6080 个。
(2) GBK/4: AA40-FEA0。
字符和汉字编码
字符和汉字编码一、字符集编码字符集编码是指将字符集中的字符转换为计算机可识别的二进制编码。
常见的字符集编码包括ASCII编码、GB2312编码、GBK编码、UTF-8编码等。
1. ASCII编码:ASCII编码是最常用的字符集编码,它包含了128个字符,每个字符用一个字节的二进制数表示。
2. GB2312编码:GB2312编码是中国大陆使用的字符集编码,它包含了6763个汉字和一些其他的字符。
3. GBK编码:GBK编码是中国大陆使用的扩展字符集编码,它包含了20902个汉字和一些其他的字符。
4. UTF-8编码:UTF-8编码是一种可变长度的字符集编码,它包含了几乎所有的语言字符,包括汉字。
二、汉字编码汉字编码是指将汉字转换为计算机可识别的二进制编码。
常见的汉字编码包括GB2312编码、GBK编码、UTF-8编码等。
1. GB2312编码:GB2312编码是中国大陆使用的汉字编码,它包含了6763个汉字。
2. GBK编码:GBK编码是中国大陆使用的扩展汉字编码,它包含了20902个汉字。
3. UTF-8编码:UTF-8编码是一种可变长度的汉字编码,它包含了几乎所有的语言字符,包括汉字。
三、字符和汉字的输入方法字符和汉字的输入方法包括键盘输入、手写输入、语音输入等。
1. 键盘输入:通过键盘输入字符和汉字,是最常用的输入方法。
2. 手写输入:通过手写输入汉字,通常需要使用专门的识别软件。
3. 语音输入:通过语音输入汉字,通常需要使用语音识别软件。
四、字体和字形的表示字体和字形的表示包括矢量字体和点阵字体。
矢量字体是一种数学描述的字体,可以无损放大;点阵字体是一种像素点的集合,放大后会出现失真。
五、编码标准编码标准是指制定字符集编码和汉字编码的规范和标准。
中国制定了《信息交换用汉字编码字符集》等标准,国际上制定了ISO/IEC 10646等标准。
六、字符和汉字的输出方法字符和汉字的输出方法包括屏幕输出、打印机输出、文件输出等。
字符的编码
扩展ASCII
• 为了表示更多的字符,各厂商制定了很多 扩展ASCII规范,但不属于ASCII标准。 IBM定制的扩展ASCII表:
大写“A”8×8点阵
汉字有多少?
• • • • • • • • • • 《说文解字》(公元100年)收9353字; 《声类》(227-239年)收11520字; 《玉篇》(543年)收22726字; 《唐韵》(751年)收26194字; 《类篇》(1066年)收31319字; 《字汇》(1615年)收33179字; 《康熙字典》(1716年)收47035字; 《中华大字典》(1915年)收48000字; 《中文大字典》(1968年)收49905字; 《汉语大字典》(1986年)收56000字。
汉字编码
输入码
(1)汉字输入码。 汉字输入码是为用户由计算机 外部设备输入汉字而编制的汉字编码,又称外码。 汉字输入码位于人机界面上,面向用户,编码原 则简单易记,操作方便,有利于提高输入速度, 汉字的输入编码很多,归纳起来主要有数字编码、 字音编码、字形编码和音形结合编码等几大类, 每种方案对汉字的输入编码并不相同,但经转换 后存入计算机内的机内码均相同。例如,我们以 全拼输入编码键入“jin”,或以五笔字型输入法 键入“QQQQ”都能得到“金”这个汉字对应的 机内码。这个工作由汉字代码转换程序依照事先 编制好的输入码对照表完成转换。
汉字编码 区位码
例 已知“戴”字的区位码是2087, 求“戴”的机内码16进制和2进制。 解:“戴”的区位码 = 1457 H, “戴”的机内码 = 1457 H + A0A0 H = B4F7 H = 1011010011110111 B。
汉字编码
字形码
(4)汉字字形码。 汉字字形码是表示汉字字形 信息的编码,也叫输出码、点阵码。目前在汉 字信息处理系统中大多以点阵方式形成汉字, 所以汉字字形码就是确定一个汉字字形点阵的 代码,全点阵字形中的每一点用一个二进制位 来表示,随着字形点阵的不同,它们所需要的 二进制位数也不同,例24×24的字形点阵, 每字需要72字节;32×32的字形点阵,每字 共需128字节,与每个汉字对应的这一串字节, 就是汉字的字形码。
编码知识点梳理
编码知识点梳理编码是计算机科学中一个至关重要的领域,它涉及到信息的表示、传输和处理。
本文将对编码领域的知识点进行梳理,以帮助读者更好地理解和掌握这一关键技术。
一、编码的基本概念1. 信息:信息是数据的抽象,是传递意义的内容。
信息可以通过不同的方式表示和处理,如文字、图像、声音等。
2. 数据:数据是信息的具体表现形式,可以是数字、字符、图像等。
数据是计算机处理的对象。
3. 编码:编码是将信息转换为数据的过程。
编码的目的是为了方便信息的传输和处理。
二、编码的分类1. 数字编码:数字编码是将模拟信号转换为数字信号的过程。
常见的数字编码方式有脉冲编码调制(PCM)。
2. 字符编码:字符编码是将字符转换为可以由计算机处理的数字代码的过程。
常见的字符编码方式有ASCII码、Unicode 等。
3. 线路编码:线路编码是将数字信号转换为适合在传输介质上传播的信号的过程。
常见的线路编码方式有单极性编码、双极性编码、差分编码等。
4. 源编码:源编码是为了减少数据的冗余度,提高传输效率。
常见的源编码方式有霍夫曼编码、LZW压缩等。
三、编码的数学基础1. 组合数学:组合数学研究离散结构及其性质,如排列组合、图论等。
组合数学为编码理论提供了重要的理论基础。
2. 数论:数论研究整数及其性质,如素数、最大公约数等。
数论在编码理论中有着广泛的应用,如循环冗余校验(CRC)。
3. 概率论与统计学:概率论与统计学研究随机现象的规律性,为编码理论提供了分析数据冗余度的方法。
四、编码算法与应用1. 线路编码算法:常见的线路编码算法有单极性编码、双极性编码、差分编码等。
它们在数据通信、计算机网络等领域有着广泛应用。
2. 源编码算法:常见的源编码算法有霍夫曼编码、LZW压缩等。
它们在数据压缩、光盘存储等领域有着广泛应用。
3. 信道编码算法:信道编码是为了提高数据传输的可靠性。
常见的信道编码算法有卷积编码、汉明编码、里德-所罗门编码等。
4. 网络编码算法:网络编码是为了提高网络传输的效率。
计算机常用的编码
计算机常用的编码一、字符编码字符编码是用于将字符集(如英文字母、数字、标点符号等)转换为计算机可以理解的二进制数的一种方式。
以下是几种常见的字符编码:1.ASCII码:ASCII码是用于将字符集转换为二进制数的标准编码方式。
它包含了128个不同的字符,每个字符由7位二进制数表示。
2.Unicode:Unicode是一种国际化的字符编码标准,它包含了世界上几乎所有语言的字符。
每个Unicode字符由16位二进制数表示。
3.GB2312和GBK:GB2312是中国国家强制标准,包含了6000多个常用汉字和英文符号。
GBK是在GB2312基础上扩展的,包含了更多的汉字和符号。
4.UTF-8:UTF-8是一种可变长度的字符编码,它能够表示任何Unicode字符。
UTF-8编码的每个字符由1到4个字节表示,对于英文字母和数字,UTF-8编码与ASCII码相同。
二、数值编码数值编码是用于将数值转换为二进制数的一种方式。
以下是几种常见的数值编码:1.二进制:二进制是最简单的数值编码方式,只有0和1两种状态。
2.十进制:十进制是我们日常使用的数值编码方式,它有0到9共10个数字。
3.十六进制:十六进制是一种简化的数值编码方式,它有0到9和A到F共16个数字。
在计算机科学中,十六进制常用于表示二进制数的简写方式。
三、图像编码图像编码是将图像数据转换为二进制数的一种方式。
以下是几种常见的图像编码:1.JPEG:JPEG是一种常用的图像压缩标准,它采用有损压缩算法,能够在保证图像质量的前提下,大大减少图像数据的存储空间。
2.PNG:PNG是一种无损压缩的图像格式,它能够保留原始图像的所有信息,并且在压缩后不失真。
PNG广泛应用于网页设计、软件界面设计等领域。
3.GIF:GIF是一种基于LZW算法的压缩图像格式,它可以支持动态图像和透明背景。
GIF广泛应用于网页中的动画、图标等设计。
四、音频编码音频编码是将音频数据转换为二进制数的一种方式。
几种常用的字符编码
常用的字符编码包括以下几种:
1. ASCII码:这是美国在19世纪60年代的时候为了建立英文字符和二进制的关系时制定的编码规范,它能表示128个字符,其中包括英文字符、阿拉伯数字、西文字符以及32个控制字符。
它用一个字节来表示具体的字符,但它只用后7位来表示字符(2^7=128),最前面的一位统一规定为0。
2. 扩展的ASCII码:原本的ASCII码对于英文语言的国家是够用了,但是欧洲国家的一些语言会有拼音,这时7个字节就不够用了。
因此一些欧洲国家就决定,利用字节中闲置的最高位编入新的符号。
比如,法语中的é的编码为130(二进制10000010)。
这样一来,这些欧洲国家使用的编码体系,可以表示最多256个符号。
此外,还有Unicode编码,世界上存在着多种编码方式,同一个二进制数字可以被解释成不同的符号。
以上内容仅供参考,如需更多信息,建议查阅计算机方面的专业书籍或咨询相关专业人士。
计算机基础知识什么是字符编码
计算机基础知识什么是字符编码计算机基础知识:什么是字符编码计算机基础知识涉及到各种术语和概念,而字符编码是其中一个非常重要的概念。
在计算机科学中,字符编码是用来表示字符的标准规范,它将字符映射为二进制数字,以便计算机能够识别和处理。
本文将介绍字符编码的基本原理和常见的字符编码方式。
一、字符编码的基本原理字符编码的基本原理是将字符与二进制数字建立对应关系。
由于计算机只能处理数字,而不能直接处理字符,所以需要将字符转换为计算机可识别的数字表示。
这种转换过程就是字符编码。
字符编码的基本思想是为每个字符分配一个唯一的编码。
不同的字符编码方案使用不同长度的二进制数字来表示字符。
最常见的字符编码方案是ASCII码。
二、ASCII码ASCII码(American Standard Code for Information Interchange)是最早的字符编码标准之一,它使用7位二进制表示128个字符,包括英文字母、数字和一些特殊字符。
ASCII码是最基本的字符编码方式,但由于只能表示128个字符,无法满足其他语言的需求。
三、Unicode编码Unicode是目前最常用的字符编码标准,它涵盖了全球几乎所有的字符。
Unicode使用不同长度的二进制数字来表示字符,最常见的是UTF-8编码和UTF-16编码。
1. UTF-8编码UTF-8(UCS Transformation Format 8-bit)是一种变长编码方式,使用1到4个字节表示字符。
UTF-8编码兼容ASCII码,对于英文字母和符号,使用1个字节表示。
对于汉字等非ASCII字符,使用多个字节表示。
UTF-8编码具有很好的兼容性和节省存储空间的特点,是互联网上最常用的字符编码方式。
2. UTF-16编码UTF-16(UCS Transformation Format 16-bit)是一种定长编码方式,使用2个字节表示大部分字符,对于辅助平面字符使用4个字节表示。
字符编码知识汇总
ASCII码知识简介目录1.ASCII编码-控制字符2.ASCII编码-可打印字符3.ASCII编码-扩展字符ASCII编码是美国信息互换标准代码(American Standard Code for Information Interchange)的简写,是基于英语的一种编码方式,用于计算机的信息传输。
符合ISO646标准。
ASCII共定义了256个代码(从0-255),从0-32位为控制字符(ASCII control characters),从33-127位为可打印字符(ASCII printable characters)。
从0-127是标准的ASCII编码,从128-255是扩展的ASCII编码。
引用网址:/xhtml/asscii/标准ASCII代码中,最高位B7为奇偶校验位。
ASCII编码-控制字符ASCII编码控制字符(ASCII control characters)二进制十进制十六进制控制字符转义字符说明000 0000 0 00 NUL \0 Null character(空字符)000 0001 1 01 SOH Start of Header(标题开始)000 0010 2 02 STX Start of Text(正文开始)000 0011 3 03 ETX End of Text(正文结束)000 0100 4 04 EOT End of Transmission(传输结束) 000 0101 5 05 ENQ Enquiry(请求)000 0110 6 06 ACK Acknowledgment(收到通知)000 0111 7 07 BEL \a Bell(响铃)000 1000 8 08 BS \b Backspace(退格)000 1001 9 09 HT \t Horizontal Tab(水平制表符) 000 1010 10 0A LF \n Line feed(换行键)000 1011 11 0B VT \v Vertical Tab(垂直制表符)000 1100 12 0C FF \f Form feed(换页键)000 1101 13 0D CR \r Carriage return(回车键)000 1110 14 0E SO Shift Out(不用切换)000 1111 15 0F SI Shift In(启用切换)001 0000 16 10 DLE Data Link Escape(数据链路转义) 001 0001 17 11 DC1 Device Control 1(设备控制1) 001 0010 18 12 DC2 Device Control 2(设备控制2) 001 0011 19 13 DC3 Device Control 3(设备控制3) 001 0100 20 14 DC4 Device Control 4(设备控制4)001 0101 21 15 NAK Negative Acknowledgement(拒绝接收)001 0110 22 16 SYN Synchronous Idle(同步空闲)001 0111 23 17 ETB End of Trans the Block(传输块结束)001 1000 24 18 CAN Cancel(取消)001 1001 25 19 EM End of Medium(介质中断)001 1010 26 1A SUB Substitute(替补)001 1011 27 1B ESC \e Escape(溢出)001 1100 28 1C FS File Separator(文件分割符) 001 1101 29 1D GS Group Separator(分组符)001 1110 30 1E RS Record Separator(记录分离符) 001 1111 31 1F US Unit Separator(单元分隔符)ASCII编码-可打印字符ASCII编码可打印字符(ASCII printable characters)二进制十进制十六进制字符010 0000 32 20 Space(空格)010 0001 33 21 !010 0010 34 22 "010 0011 35 23 #010 0100 36 24 $010 0101 37 25 %010 0110 38 26 &010 0111 39 27 '010 1000 40 28 (010 1001 41 29 )010 1010 42 2A *010 1011 43 2B +010 1100 44 2C ,010 1101 45 2D -010 1110 46 2E .010 1111 47 2F / 011 0000 48 30 0 011 0001 49 31 1 011 0010 50 32 2 011 0011 51 33 3 011 0100 52 34 4 011 0101 53 35 5 011 0110 54 36 6 011 0111 55 37 7 011 1000 56 38 8 011 1001 57 39 9 011 1010 58 3A : 011 1011 59 3B ; 011 1100 60 3C < 011 1101 61 3D = 011 1110 62 3E > 011 1111 63 3F ? 100 0000 64 40 @ 100 0001 65 41 A 100 0010 66 42 B 100 0011 67 43 C 100 0100 68 44 D 100 0101 69 45 E 100 0110 70 46 F 100 0111 71 47 G 100 1000 72 48 H 100 1001 73 49 I 100 1010 74 4A J 100 1011 75 4B K 100 1100 76 4C L 100 1101 77 4D M 100 1110 78 4E N 100 1111 79 4F O 101 0000 80 50 P 101 0001 81 51 Q 101 0010 82 52 R 101 0011 83 53 S101 0100 84 54 T 101 0101 85 55 U 101 0110 86 56 V 101 0111 87 57 W 101 1000 88 58 X 101 1001 89 59 Y 101 1010 90 5A Z 101 1011 91 5B [ 101 1100 92 5C \ 101 1101 93 5D ] 101 1110 94 5E ^ 101 1111 95 5F _ 110 0000 96 60 ` 110 0001 97 61 a 110 0010 98 62 b 110 0011 99 63 c 110 0100 100 64 d 110 0101 101 65 e 110 0110 102 66 f 110 0111 103 67 g 110 1000 104 68 h 110 1001 105 69 i 110 1010 106 6A j 110 1011 107 6B k 110 1100 108 6C l 110 1101 109 6D m 110 1110 110 6E n 110 1111 111 6F o 111 0000 112 70 p 111 0001 113 71 q 111 0010 114 72 r 111 0011 115 73 s 111 0100 116 74 t 111 0101 117 75 u 111 0110 118 76 v 111 0111 119 77 w 111 1000 120 78 x111 1001 121 79 y 111 1010 122 7A z 111 1011 123 7B { 111 1100 124 7C | 111 1101 125 7D } 111 1110 126 7E ~ASCII编码-扩展字符ASCII编码扩展字符二进制十进制十六进制0111 1111 127 7f1000 0000 128 801000 0001 129 811000 0010 130 821000 0011 131 831000 0100 132 841000 0101 133 851000 0110 134 861000 0111 135 871000 1000 136 881000 1001 137 891000 1010 138 8a1000 1011 139 8b1000 1100 140 8c1000 1101 141 8d1000 1110 142 8e1000 1111 143 8f1001 0000 144 901001 0001 145 911001 0010 146 921001 0011 147 931001 0100 148 941001 0101 149 951001 0110 150 961001 0111 151 971001 1000 152 981001 1001 153 991001 1011 155 9b 1001 1100 156 9c 1001 1101 157 9d 1001 1110 158 9e 1001 1111 159 9f 1010 0000 160 a0 1010 0001 161 a1 1010 0010 162 a2 1010 0011 163 a3 1010 0100 164 a4 1010 0101 165 a5 1010 0110 166 a6 1010 0111 167 a7 1010 1000 168 a8 1010 1001 169 a9 1010 1010 170 aa 1010 1011 171 ab 1010 1100 172 ac 1010 1101 173 ad 1010 1110 174 ae 1010 1111 175 af 1011 0000 176 b0 1011 0001 177 b1 1011 0010 178 b2 1011 0011 179 b3 1011 0100 180 b4 1011 0101 181 b5 1011 0110 182 b6 1011 0111 183 b7 1011 1000 184 b8 1011 1001 185 b9 1011 1010 186 ba 1011 1011 187 bb 1011 1100 188 bc 1011 1101 189 bd 1011 1110 190 be1100 0000 192 c0 1100 0001 193 c1 1100 0010 194 c2 1100 0011 195 c3 1100 0100 196 c4 1100 0101 197 c5 1100 0110 198 c6 1100 0111 199 c7 1100 1000 200 c8 1100 1001 201 c9 1100 1010 202 ca 1100 1011 203 cb 1100 1100 204 cc 1100 1101 205 cd 1100 1110 206 ce 1100 1111 207 cf 1101 0000 208 d0 1101 0001 209 d1 1101 0010 210 d2 1101 0011 211 d3 1101 0100 212 d4 1101 0101 213 d5 1101 0110 214 d6 1101 0111 215 d7 1101 1000 216 d8 1101 1001 217 d9 1101 1010 218 da 1101 1011 219 db 1101 1100 220 dc 1101 1101 221 dd 1101 1110 222 de 1101 1111 223 df 1110 0000 224 e0 1110 0001 225 e1 1110 0010 226 e2 1110 0011 227 e31110 0100 228 e4 1110 0101 229 e5 1110 0110 230 e6 1110 0111 231 e7 1110 1000 232 e8 1110 1001 233 e9 1110 1010 234 ea 1110 1011 235 eb 1110 1100 236 ec 1110 1101 237 ed 1110 1110 238 ee 1110 1111 239 ef 1111 0000 240 f0 1111 0001 241 f1 1111 0010 242 f2 1111 0011 243 f3 1111 0100 244 f4 1111 0101 245 f5 1111 0110 246 f6 1111 0111 247 f7 1111 1000 248 f8 1111 1001 249 f9 1111 1010 250 fa 1111 1011 251 fb 1111 1100 252 fc 1111 1101 253 fd 1111 1110 254 fe 1111 1111 255 ffunicode目录Unicode 的编码和实现非Unicode 环境XML 和Unicode输入Unicode为什么使用Unicode?Unicode(统一码、万国码、单一码)是一种在计算机上使用的字符编码。
中文字符的编码方式
中文字符的编码方式中文字符的编码方式主要有两种:ASCII 和 Unicode。
在计算机中,为了能够存储和传输字符,需要将字符映射到数字(编码),而这个过程就是字符编码。
中文字符通常使用 Unicode 进行编码。
1. ASCII 编码:ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是最早的字符编码方式,只包含了英文字母、数字、标点符号等基本字符,对中文字符不支持。
ASCII 编码使用一个字节(8位)表示一个字符。
在ASCII 编码中,英文字符'A' 对应的二进制表示是01000001。
2. Unicode 编码:为了支持全球各种语言的字符,Unicode 应运而生。
Unicode 使用更多的位来表示字符,常见的有UTF-8、UTF-16 和 UTF-32。
• UTF-8:采用不定长的编码方式,可以使用1到4个字节表示一个字符。
UTF-8 是最常用的 Unicode 编码方式,也是在 Web 中广泛使用的编码方式。
• UTF-16:使用16位或32位的编码方式,可以表示大部分字符,但相对于 UTF-8 占用更多的空间。
• UTF-32:使用32位的编码方式,每个字符占用固定的4个字节。
例如,中文字符 '中' 在 UTF-8 编码中可能对应的字节序列是111001001011000010001010。
在实际应用中,UTF-8 是比较常见的选择,因为它既能够表示全球范围内的字符,又相对节省存储空间。
当然,在某些特定场景,比如数据库、网络传输等,可能会选择其他编码方式。
几种字符编码的关系
几种字符编码的关系不同的字符编码通常用于在计算机系统中表示字符集。
以下是一些常见的字符编码及其之间的关系:1. ASCII(美国标准信息交换码):ASCII是最基本的字符编码,使用7位编码来表示128个字符,包括英文字母、数字和一些常用符号。
ASCII编码是其他字符编码的基础。
2. ISO-8859:ISO-8859是ASCII的扩展编码,使用8位编码来表示256个字符。
有ISO-8859-1到ISO-8859-15等多个版本,每个版本包含不同的语言字符。
3. Unicode:Unicode是全球字符集的标准编码,包含几乎所有的字符、符号和表意文字。
Unicode使用16位编码(称为UTF-16)来表示字符,但有一些字符使用32位编码(称为UTF-32)。
4. UTF-8:UTF-8是一种变长编码,可以使用1到4个字节来表示Unicode字符。
UTF-8编码兼容ASCII编码,对于ASCII字符,使用1个字节表示,而其他字符使用多个字节表示。
5. UTF-16:UTF-16是一种使用16位编码的Unicode编码方式。
对于基本多文种平面(BMP)中的字符,使用两个字节表示,而其他字符使用4个字节表示。
6. UTF-32:UTF-32是一种使用32位编码的Unicode编码方式,每个字符都使用4个字节表示。
与UTF-8和UTF-16相比,UTF-32编码在存储空间方面需要更多的内存。
总之,ASCII编码是字符编码的起点,而ISO-8859、Unicode 和它们的变种(如UTF-8、UTF-16和UTF-32)是后续发展的结果,目的是支持更多的字符和语言。
字符编码
GB2312
GB2312也是ANSI编码里的一种,对ANSI编码最初始的ASCII编码进行扩充,为了满足国内在计算机中使用汉 字的需要,中国国家标准总局发布了一系列的汉字字符集国家标准编码,统称为GB码,或国标码。其中最有影响 的是于1980年发布的《信息交换用汉字编码字符集基本集》,标准号为GB 2312-1980,因其使用非常普遍,也常 被通称为国标码。GB2312编码通行于我国内地;新加坡等地也采用此编码。几乎所有的中文系统和国际化的软件 都支持GB 2312。
UTF-8的编码是这样得出来的,以”汉”这个字为例:
“汉”字的Unicode编码是U+00006C49,然后把U+00006C49通过UTF-8编码器进行编码,最后输出的UTF-8 编码是E6B189。
Base64
Base64编码有的电子邮件系统(比如国外信箱)不支持非英文字母(比如汉字)传输,这是历史原因造成的(认 为只有美国会使用电子邮件?)。因为一个英文字母使用ASCII编码来存储,占存储器的1个字节(8位),实际上只 用了7位2进制来存储,第一位并没有使用,设置为0,所以,这样的系统认为凡是第一位是1的字节都是错误的。 而有的编码方案(比如GB2312)不但使用多个字节编码一个字符,并且第一位经常是1,于是邮件系统就把1换成0, 这样收到邮件的人就会发现邮件乱码。
ASCII码使用7位2进制数表示一个字符,7位2进制数可以表示出2的7次方个字符,共128个字符。EBCDIC码 使用8位,可以表示出2的8次方个字符,256个字符。
python常用编码
python常用编码
Python是一种高级编程语言,它被广泛应用于数据分析、人工智能、Web开发等领域。
在Python编程中,编码是一个重要的问题,因为不同的编码会影响字符串、文件等数据的处理和存储。
以下是Python中常用的编码:
1. ASCII编码
ASCII编码是一种最早的字符编码,它只能表示128个字符,包括字母、数字、标点符号等。
ASCII编码是Python中默认的编码方式。
2. UTF-8编码
UTF-8编码是一种Unicode编码的实现方式,它可以表示所有Unicode字符,包括国际上的各种语言和符号。
UTF-8编码是Python 中最常用的编码方式。
3. GBK编码
GBK编码是一种用于中文的字符编码,它可以表示中文字符、标点符号等。
GBK编码是Python中常用的编码方式。
4. Unicode编码
Unicode编码是一种国际化字符编码,它可以表示所有文字符号,包括各种语言和符号。
Unicode编码在Python中也得到了广泛应用。
在Python编码中,我们可以使用encode()和decode()函数进行编码和解码操作,以处理不同编码的数据。
同时,在处理文件时,需要注意文件的编码格式,以免出现乱码等问题。
总之,Python编码是Python编程中不可避免的一个问题,我们需要了解不同的编码方式,并掌握相应的编码技巧,以保证程序的正确性和可读性。
字母和数字的编码
字母和数字的编码在计算机科学、通信和信息技术领域,字母和数字的编码是非常重要的。
字母和数字编码是将字母、数字和其他字符转换为计算机可以识别和处理的二进制表示形式的过程。
这种编码确保了在不同的计算机系统和通信设备之间的信息交换的无缝连接。
本文将讨论几种常见的字母和数字编码。
1. ASCII编码ASCII(American Standard Code for Information Interchange)是最早的计算机字符编码标准。
它使用7位或8位二进制数表示字符,可以表示128或256个字符,包括英文字母、数字、标点符号和一些控制字符。
ASCII编码广泛应用于计算机系统中,特别是在早期的计算机中。
2. Unicode编码随着计算机技术的发展,使用ASCII编码的局限性变得越来越明显。
为了解决这个问题,Unicode编码应运而生。
Unicode是一种全球性的字符编码标准,它可以表示世界上几乎所有的字符。
Unicode编码可以使用不同的位数来编码字符,其中最常见的是UTF-8编码。
3. UTF-8编码UTF-8(Unicode Transformation Format 8-bit)是一种可变长度的Unicode编码。
它使用8位二进制数来编码字符,保证了向后兼容性和向前可扩展性。
UTF-8编码被广泛应用于互联网和计算机系统中,支持多种语言和字符集。
4. 基于位置的编码除了ASCII、Unicode和UTF-8之外,还有一种基于位置的编码方法,如十进制和二进制编码。
十进制编码使用10个数字来表示字符,而二进制编码使用0和1来表示字符。
这种编码方法在某些特定的系统中使用,例如光学字符识别。
5. URL编码除了字符编码,还有一种特定的编码方法被用于将URL中的非ASCII字符转换为可在互联网上传输的形式。
URL编码使用%加ASCII 代码的形式,如%20代表空格。
这种编码方式确保了URL的正确传输和解析。
字符编码的方式
字符编码的方式字符编码是将字符(如字母、数字、符号和汉字等)转换为计算机可以识别的二进制数字序列的过程。
以下是一些常见的字符编码方式:1. ASCII(American Standard Code for Information Interchange)编码:用于表示英文和其他西文字符。
使用一个字节(8位)进行编码,共有128个不同的字符(0-127),其中前32个字符通常用于控制用途(如换行、制表等)。
每个字符的最高位固定为0。
2. 扩展ASCII(Extended ASCII)编码:为了表示更多的欧洲文字和特殊符号,扩展了ASCII编码。
也使用一个字节进行编码,但编码范围扩展到128-255。
3. ISO-8859系列编码:这是一组不同的字符集编码,每个版本对应一种或多种欧洲语言的字符集。
通常也使用一个字节进行编码,但具体能表示的字符集因版本不同而不同。
4. Unicode(Universal Character Set, UCS)编码:设计用来统一表示世界上几乎所有字符和符号的编码系统。
最常用的Unicode实现是UTF-16,它使用两个字节(16位)来表示基本多文种平面(BMP)中的字符,对于超出BMP的字符,需要使用四个字节(surrogate pairs)。
Unicode还包括UTF-32编码,它始终使用四个字节来表示每个字符。
5. UTF-8(Unicode Transformation Format - 8 bits)编码:是Unicode的一种变长字节编码方式,非常流行且广泛使用。
英文字符通常用一个字节编码(与ASCII兼容),欧洲字符通常用两个字节,而大多数CJK(中文、日文、韩文)字符用三个字节,极少数字符用四个字节。
UTF-8的最大优点是向前兼容ASCII,并且在文本中包含大量英文字符时可以节省存储空间。
powershell 字符编码
powershell 字符编码PowerShell是微软公司推出的一款命令行界面和脚本语言。
它可以访问Windows操作系统的各个组件,并提供了一系列方便的命令和函数,使得管理Windows系统变得更加容易。
在使用PowerShell时,我们可能会遇到字符编码的问题。
下面,我们将详细讲解PowerShell 字符编码的相关内容。
第一步:了解什么是字符编码在计算机中,每个字符都需要用一定的编码方式表示。
常见的字符编码方式有ASCII、UTF-8、GBK等。
不同的字符编码方式使用不同的位数来表示字符,因此在不同的编码方式下,同一个字符的二进制表示方式就可能不同。
如果在不同编码方式下处理同一个字符串,就会出现乱码问题。
第二步:查看PowerShell使用的字符编码为了避免在使用PowerShell时出现乱码问题,我们需要知道PowerShell使用的字符编码方式。
可以使用以下命令查看当前PowerShell使用的字符编码:$OutputEncoding如果输出结果为utf8,则表示当前PowerShell使用的是UTF-8字符编码。
如果输出结果为ASCII,则表示当前PowerShell使用的是ASCII字符编码。
第三步:修改PowerShell使用的字符编码如果发现PowerShell默认使用的字符编码方式不正确,我们就需要修改它。
可以使用以下命令修改PowerShell使用的字符编码:$OutputEncoding = [System.Text.Encoding]::GetEncoding("编码方式")例如,如果我们想要将PowerShell的字符编码方式修改为GBK,就可以使用以下命令:$OutputEncoding =[System.Text.Encoding]::GetEncoding("GBK")需要注意的是,修改字符编码方式只对后续的命令有效,之前已经输出的内容不会受到影响。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Unicode 的出现
虽然通过使用不同字符集, 我们可以在一台机器上查阅不同语言的文档,但是我们仍然无法解决一个 问题:在一份文档中显示所有字符。为了解决这个问题,我们需 要一个全人类达成共识的巨大的字 符集,这就是 Unicode 字符集。
Unicode 字符集概述
Unicode 字符集涵盖了目前人类使用的所有字符,并为每个字符进行统一编号,分配唯一的字符码 (Code Point)。Unicode 字符集将所有字符按照使用上的频繁度划分为 17 个层面(Plane),每 个层面上有 216=65536 个字符码空间。
这种方式的缺点在于,字符和了,要往现有字符集中加入火星文就变得 很难甚至不可能了,而且很容易破坏现有 的编码规则。
因此 Unicode 在设计上考虑到了这一点,将字符集和字符编码方案分离开。
也就是说,虽然每个字符在 Unicode 字符集中都 能找到唯一确定的编号(字符码,又称 Unicode 码),但是决定最终字节流的却是具体的字符编码。例如同样是对 Unicode 字符“A”进行编码, UTF-8 字符编码得到的字节流是 0x41,而 UTF-16(大端模式)得到的是 0x00 0x41。
(关于 936 代码页中完整的码表信息,参见 MSDN: /en-us/library/cc194913%28v=MSDN.10%29.aspx.) 按照 936 代码页的码表,当程序遇到连续字节流 0x81 0x40 的时候,就会解码为“丂”字符。
事实上,大部分 OEM 字符集是兼容 ASCII 字符集的,也就是说,大家对于 0x00~0x7F 这个范围的 解释基本是相同的,而对于后半部分 0x80~0xFF 的解释却不一定相同。甚至有时候同样的字符在不 同 OEM 字符集中对应的字节也是不同的。 不同的 OEM 字符集导致人们无法跨机器交流各种文档。例如职员甲发了一封简历 résumés 给职员 乙, 结果职员乙看到的却是 r sum s, 因为 é 字符在职员甲机器上的 OEM 字符集中对应的字节是 0x82, 而在职员乙的机 器上,由于使用的 OEM 字符集不同,对 0x82 字节解码后得到的字符却是 。
常见的 Unicode 编码
UCS-2/UTF-16 如果要我们来实现 Unicode 字符集中 BMP 字符的编码方案, 我们会怎么实现?由于 BMP 层面上有 216=65536 个字 符码,因此我们只需要两个字节就可以完全表示这所有的字符了。 举个例子,“中”的 Unicode 字符码是 0x4E2D(01001110 00101101),那么我们可以编码为 01001110 00101101(大端)或者 00101101 01001110 (小端)。 UCS-2 和 UTF-16 对于 BMP 层面的字符均是使用 2 个字节来表示,并且编码得到的结果完全一致。 不同之处在于,UCS-2 最初设计的时候只考虑到 BMP 字符,因此使用固定 2 个字节长度,也就是 说,他 无法表示 Unicode 其他层面上的字符,而 UTF-16 为了解除这个限制,支持 Unicode 全字 符集的编解码,采用了变长编码,最少使用 2 个字节,如 果要编码 BMP 以外的字符,则需要 4 个 字节结对,这里就不讨论那么远,有兴趣可以参考维基百科:UTF-16/UCS-2。
OEM 字符集的衍生
当计算机开始发展起来的时候, 人们逐渐发现, ASCII 字符集里那可怜的 128 个字符已经不能再满足 他们的需求了。人们就在想,一个字节能够表示的 数字(编号)有 256 个,而 ASCII 字符只用到了 0x00~0x7F,也就是占用了前 128 个,后面 128 个数字不用白不用,因此很多人打起了后面这 128 个数字的主意。可是问题在于,很多人同时有这样的想法,但是大家对于 0x80-0xFF 这后面的 128 个数字分别对应什么样的字符,却有各自的想 法。这就导致了当时销往世界各地的机器上出现了大 量各式各样的 OEM 字符集。 下面这张表是 IBM-PC 机推出的其中一个 OEM 字符集,字符集的前 128 个字符和 ASCII 字符集的 基本一致 (为什么说基本一致呢, 是因为前 32 个控制字符在某些情况下会被 IBM-PC 机当作可打印 字符解释),后面 128 个字符空间加入了一些欧洲国家用到的重音字符,以及一些用于画线条画的 字符。
多字节字符集(MBCS)和中文字符集
上面我们提到的字符集都是基于单字节编码,也就是说,一个字节翻译成一个字符。这对于拉丁语系 国家来说可能没有什么问题, 因为他们通过扩展第 8 个比 特, 就可以得到 256 个字符了, 足够用了。 但是对于亚洲国家来说,256 个字符是远远不够用的。因此这些国家的人为了用上电脑,又要保持和 ASCII 字符 集的兼容,就发明了多字节编码方式,相应的字符集就称为多字节字符集。例如中国使 用的就是双字节字符集编码(DBCS,Double Byte Character Set)。 对于单字节字符集来说,代码页中只需要有一张码表即可,上面记录着 256 个数字代表的字符。程 序只需要做简单的查表操作就可以完成编解码的过程。 代码页是字符集编码的具体实现,你可以把他理解为一张“字符-字节”映射表,通过查表实现“字 符-字节”的翻译。下面会有更详细的描述。 而对于多字节字符集, 代码页中通常会有很多码表。那么程序怎么知道该使用哪张码表去解码二进制 流呢?答案是,根据第一个字节来选择不同的码表进行解析。 例如目前最常用的中文字符集 GB2312,涵盖了所有简体字符以及一部分其他字符;GBK(K 代表扩 展的意思)则在 GB2312 的基础上加入了对繁 体字符等其他非简体字符(GB18030 字符集不是双 字节字符集, 我们在讲 Unicode 的时候会提到) 。 这两个字符集的字符都是使用 1-2 个字节来表 示。 Windows 系统采用 936 代码页来实现对 GBK 字符集的编解码。在解析字节流的时候,如果遇到字
ANSI 标准、国家标准、ISO 标准
不同 ASCII 衍生字符集的出现,让文档交流变得非常困难,因此各种组织都陆续进行了标准化流程。 例如美国 ANSI 组织制定了 ANSI 标准字符编码 (注意,我们现在通常说到 ANSI 编码,通常指的 是平台的 默认编码,例如英文操作系统中是 ISO-8859-1,中文系统是 GBK),ISO 组织制定的各 种 ISO 标准字符编码, 还有各国也会制定一些国家标准字符集,例如中国的 GBK,GB2312 和 GB18030。 操作系统在发布的时候, 通常会往机器里预装这些标准的字符集还有平台专用的字符集,这样只要你 的文档是使用标准字符集编写的,通用性就比较高了。例 如你用 GB2312 字符集编写的文档,在中 国大陆内的任何机器上都能正确显示。 同时,我们也可以在一台机器上阅读多个国家不同语言的文档 了,前提是本机必 须安装该文档使用的字符集。
(上图中的 x 代表 Unicode 码的低 8 位,y 代表高 8 位) 对于 ASCII 字符的编码使用单字节,和 ASCII 编码一摸一样,这样所有原先使用 ASCII 编解码的文 档就可以直接转到 UTF-8 编码了。对于其他字符,则使用 2-4 个字节来表示,其中,首字节前置 1 的 数目代表正确解析所需要的字节数,剩余字节的高 2 位始终是 10。例如首字节是 1110yyyy,
Windows 从 NT 时代开始就采用了 UTF-16 编码,很多流行的编程平台,例如.Net,Java,Qt 还有 Mac 下的 Cocoa 等都是使用 UTF-16 作为基础的字符编码。例如代码中的字符串,在内存中相应的 字节流就是用 UTF-16 编码过的。 UTF-8 UTF-8 应该是目前应用最广泛的一种 Unicode 编码方案。 由于 UCS-2/UTF-16 对于 ASCII 字符使用 两个字节进行编码,存储和处理 效率相对低下,并且由于 ASCII 字符经过 UTF-16 编码后得到的两 个字节,高字节始终是 0x00,很多 C 语言的函数都将此字节视为字符串末尾从而导致 无法正确解 析文本。因此一开始推出的时候遭到很多西方国家的抵触,大大影响了 Unicode 的推行。后来聪明 的人们发明了 UTF-8 编码,解决了这个问 题。 UTF-8 编码方案采用 1-4 个字节来编码字符,方法其实也非常简单。
ASCII 字符集由 95 个可打印字符(0x20-0x7E)和 33 个控制字符(0x00-0x19,0x7F)组成。可 打印字符用于显示在输出设备 上,例如荧屏或者打印纸上,控制字符用于向计算机发出一些特殊指 令,例如 0x07 会让计算机发出哔的一声,0x00 通常用于指示字符串的结束,0x0D 和 0x0A 用于指 示打印机的打印针头退到行首(回车)并移到下一行(换行)。 那时候的字符编解码系统非常简单, 就是简单的查表过程。例如将字符序列编码为二进制流写入存储 设备,只需要在 ASCII 字符集中依次找到字符对应的 字节,然后直接将该字节写入存储设备即可。 解码二进制流的过程也是类似。
还是得从 ASCII 码说起
说到字符编码,不得不说 ASCII 码的简史。计算机一开始发明的时候是用来解决数字计算的问题,后 来人们发现,计算机还可以做更多的事,例如文本处 理。但由于计算机只识“数”,因此人们必须 告诉计算机哪个数字来代表哪个特定字符, 例如 65 代表字母‘A’, 66 代表字母‘B’, 以此类推。 但是计算机之间字符-数字的对应关系必须得一致, 否则就会造成同一段数字在不同计算机上显 示出 来的字符不一样。因此美国国家标准协会 ANSI 制定了一个标准,规定了常用字符的集合以及每个字 符对应的编号,这就 是 ASCII 字符集(Character Set),也称 ASCII 码。 当时的计算机普遍使用 8 比特字节作为最小的存储和处理单元,加之当时用到的字符也很少,26 个 大小写英文字母还有数字再加上其他常用符号,也不到 100 个,因此使用 7 个比特位就可以高效的 存储和处理 ASCII 码,剩下最高位 1 比特被用作一些通讯系统的奇偶校验。 注意,字节代表系统能够处理的最小单位,不一定是 8 比特。只是现代计算机的事实标准就是用 8 比特来代表一个字节。在很多技术规格文献中,为了避免产 生歧义,更倾向于使用 8 位组(Octet) 而不是字节(Byte)这个术语来强调 8 个比特的二进制流。下文中为了便于理解,我会延用大家熟 悉的“字节”这 个概念。