为什么需要字符编码

1.

计算机一开始发明出来时是用来解决数字计算问题的,后来人们发现,计算机还可以做更多的事,例如文本处理。

但计算机其实挺“笨”的,它只“认识”010110111000…这样由0和1两个数字组成的二进制数字,这是因为计算机的底层硬件实现就是用电路的断开和闭合两种状态来表示0和1两个数字的。因此,计算机只可以直接存储和处理二进制数字。

2.

为了在计算机上也能表示、存储和处理像文字、符号等等之类的字符,就必须将这些字符转换成二进制数字。

当然,肯定不是我们想怎么转换就怎么转换,否则就会造成同一段二进制数字在不同计算机上显示出来的字符不一样的情况,因此必须得定一个统一的标准进行转换。

于是就设计出了进行这种转换的标准——字符编码标准。

字符编码标准的演变

1.

字符编码标准实际上经历了如下三个阶段的演变过程:

① ASCII编码标准阶段 → ② ANSI编码标准阶段 → ③ Unicode/UCS编码标准阶段。

在第一个阶段的ASCII编码标准阶段,ASCII编码标准主要适用于美国(与美国同文的英国大致上也适用)。

后来计算机发展到欧洲各国以及世界各地,开始发展到了作为第二阶段的ANSI编码标准阶段,各个国家和地区先后各自制定了既兼容ASCII但又互不兼容的ANSI编码标准。

ANSI编码标准阶段的各自为政,为世界各个国家和地区基于计算机的信息交流带来了极大的不便,痛定思痛之余,终于通过Unicode/UCS编码标准的制定发展到了第三阶段,最终Unicode编码标准胜出。

EBCDIC码与ASCII码

1.

最开始设计出来的字符编码标准实际上并非ASCII编码标准,而是EBCDIC编码标准。EBCDIC,是Extended Binary Coded Decimal Interchange Code(即扩展二进制编码的十进制交换码)的缩写。

EBCDIC码是由国际商用机器公司(即IBM)为大型机操作系统而开发设计的,于1964年推出。

在EBCDIC码中,英文字母不是连续排列的,中间出现多次断续,这带来了一些困扰和麻烦。

因此,在后来IBM的个人计算机和工作站操作系统中并没有采用EBCDIC码,而是采用了晚于EBCDIC码推出、且后来成为了英文字符编码工业标准的ASCII编码标准。

2.

ASCII码(American Standard Code for Information Interchange美国信息交换标准码),由美国国家标准学会ANSI(American National Standard Institute)于1968年正式制定。

之后,ASCII编码标准又于1972年被ISO/IEC采用,制定为ISO/IEC 646标准(ISO,即国际标准化组织International Standardization Organization,成立于1946年;IEC,即国际电工技术委员会International Electrotechnical Commission,成立于1906年;ISO/IEC往往用来表示由这两大国际组织联合制定的标准)。因此,ISO/IEC 646(常简称为ISO 646)与ASCII指的是同一个编码标准。

由于ASCII码要晚于EBCDIC码出现(网上也有文章说是ASCII码要早于EBCDIC码开始设计,但1968年ASCII码才正式确定为标准),ASCII码的编码方式参照了EBCDIC码,并吸取了其经验教训,将英文字母进行了连续排列,这方便了程序处理。

3.

ASCII编码标准虽然不是最早出现的字符编码标准,但目前却是最基础、最重要、应用最广泛的字符编码标准。

目前所通行的其他字符编码标准,比如ISO-8859系列、GB系列(GB2312、GBK、GB18030、GB13000)、Big5、Unicode等等,均直接或间接兼容ASCII码。

而像EBCDIC这样与ASCII完全不兼容的编码标准,基本上处于已淘汰或将要淘汰的境地。

ASCII字符编码标准简介

1.

ASCII码使用七个二进制数字(即比特)来表示一个字符,总共表示128个字符(2^7 = 128,二进制编码为0000 0000 ~ 0111 1111,对应的十进制就是0~127)。

由于目前计算机普遍采用8位作为一个字节来进行存取与处理,因此剩下最高位的那1比特一般为0,但有时在一些通讯系统中也被用作奇偶校验位。

2.

ASCII字符集共计有128个字符(见上表),码点编号(即字符编号)从0到127(二进制为从0000 0000到0111 1111,十六进制为从0x00到0x7F),二进制最高位都是0。其中:

  • 0~31:不可显示不可打印的控制字符或通讯专用字符,如0x07(BEL响铃)会让计算机发出哔的一声、0x00(NUL空,注意不是空格)通常用于指示字符串的结束、0x0D(CR回车)和0x0A(LF换行)用于指示打印机的打印针头退到行首(即回车)并移到下一行(即换行)等;

注: 将这些用于控制或通讯的控制字符或通讯专用字符称之为“字符”,感觉上似乎有点怪,实际上这些所谓的“字符”表示的其实是一种动作或行为,因此才既不可显示也不可能打印。

  • 32:可显示但不可打印的空格字符;
  • 33~126:可显示可打印字符,其中48~57为0-9的阿拉伯数字,65~90为26个大写英文字母,97~122为26个小写英文字母,其余的是一些标点符号、运算符号等;
  • 127:不可显示不可打印的控制字符DEL。

3.

这时候的字符编解码非常简单,比如若要将字符序列编码为二进制流写入存储设备,只需要将该字符序列里的各个字符在ASCII字符集中的字符编号(即码点编号),直接以一个二进制字节写入存储设备即可。

此时,字符编号就是字符编码,中间不需要经过特别的编码算法进行字符编号到字符编码的转换计算,更不存在所谓码元序列到字节序列的转换。

【转】刨根究底字符编码【2.0版】(3):字符编码的由来、演变与ASCII码相关推荐

  1. c#字符型转化为asc_C#中使用强制类型实现字符串和ASCII码之间的转换

    C#貌似没有专门用于ASCII码转字符或字符转ASCII码的系统函数,所以小编这里就借用一下强制类型转换来实现ASCII码与字符之间的互转. 所谓的ASCII码,即American Standard ...

  2. Unicode编码与C语言宽字符

    文章目录 1.ASCII.ANSI.Unicode都是什么? 2.为什么需要宽字符? 3.C语言如何处理宽字符? 4.Windows中的字符串函数 1.ASCII.ANSI.Unicode都是什么? ...

  3. 最新ONE兔V3.0版/婚恋/交友/社交APP三端源码

    正文: 最新ONE兔v3.0版/婚恋/交友/社交APP/原生手机客户端源码,原生手端,非uniapp,搭建难度不低.纯源码,全开源,需编译后方可使用,有喜欢这一类的可以拿去研究了. 本系统包括:网站p ...

  4. 转义序列字符(\0,\n,\r,\t,\v,\a,\f,\b,\\,\‘,\“,\?)详解,转义字符对应的全称,输出结果和对应的ASCII码值详解;

    文章目录 前言 转义序列字符(Escape Sequence Character): 一.\0:空字符 二.\n:换行符 三.\r:回车符 四.\t:水平制表符 五.\v:垂直制表符 六.\a:响铃 ...

  5. php中文ascii码范围,标准ascii码字符集共有几个编码?

    标准ascii码字符集共有128个编码.标准ASCII码是用7个二进制位表示1个字符,由于2的7次方为128,所以标准ASCII码字符集共有编码128个:而每一个编码代表一个基本符号,也就是说,使用A ...

  6. ASCII码值与对应字符的转换

    字符数据在计算机中主要是以ASCII码值存储的,那么我们怎么对字符和ASCII进行转换呢,其实我们只要知道要转换的字符和其对应的码值就行了 代码如下: #include<stdio.h> ...

  7. JS字符串截取方法 JS字符串查找指定字符方法 JS字符串替换指定字符方法 JS字符串插入指定位置方法 JS字符串删除指定字符方法

    js字符串截取的方法 方法一: str.slice(开始位置,结束位置) //start 参数字符串中第一个字符位置为 0, 第二个字符位置为 1, 以此类推,如果是负数表示从尾部截取多少个字符串,s ...

  8. 【转】刨根究底字符编码【2.0版】(2):关键术语解释

    上一篇中讲道,字符编码所涉及的面非常广,向下的话,涉及到计算机的底层技术,甚至是硬件实现. 因此,这里就让我们从字符编码涉及到的最基本的术语讲起.大部分术语你可能都已经有了解了,但我们现在从字符编码的 ...

  9. 【转】刨根究底字符编码【2.0版】(1):开篇

    首先跟大家分享一个有趣的亲身经历.有一次,在网上我看到有程序员发了一个帖子,帖子题目乍一看让人感到惊愕,但细一想又让我会心一笑. 这个帖子的题目大致上是这样的:字符编码是不是让程序员最感到恶心的问题? ...

最新文章

  1. 清华校友打造Python调试神器
  2. 刚才遇到了关于C#使用外部DLL函数上的char*的问题。
  3. Python3可变字符串代码实现
  4. Java中string拼接,StringBuilder,StringBuffer和+
  5. java中br.readline_Java:java中BufferedReader的read()及readLine()方法的使用心得
  6. 【Java从0到架构师】Dubbo 基础 - 设置启动时检查、直接提供者、线程模型、负载均衡、集群容错、服务降级
  7. java 一级缓存,MyBatis一级缓存避坑完全指南
  8. javascript实现blob流、base64,file、base64的互相转换
  9. Python实战项目(一)使用API
  10. 随笔分类 - PowerShell
  11. 大数据小项目之电视收视率企业项目11
  12. 抖音上线“冬季山货节”,不声不响把拼多多老家“偷了”?
  13. GICv3软件overview手册之GICv4对虚拟LPI的直接注入(1)
  14. Mybatis从入门到精通上篇
  15. Elasticsearch:理解搜索中的 precision 及 recall
  16. HBase的数据热点和Hbase常见避免热点问题的方法
  17. SX1278 Lora跳频
  18. 如何将PDF文件转换CAD格式?
  19. [绍棠] Nginx基本使用
  20. java jtextfield内容_Swing系列之JTextField(单行文本框)

热门文章

  1. npm run build后如何打开index.html跑起项目
  2. [原创]mybatis中整合ehcache缓存框架的使用
  3. MVC — 初步理解IIS工作流程
  4. delphi下实现ribbon界面的方法(一)
  5. 磁盘 I/O 性能监控指标和调优方法
  6. 从委托而起(二)认识委托
  7. XML文档的基本操作
  8. [Leetcode][第322题][JAVA][零钱兑换][回溯][记忆化搜索][动态规划]
  9. Java如何随机出石头剪刀布_JAVA编程实现石头剪刀布
  10. 基于matlab的图像分割,基于MATLAB的图像分割算法研究毕业论文