ASCII

  上个世纪60年代,美国制定了基于拉丁字母的一套电脑编码系统,取名为ASCII。它主要用于显示现代英语和其他西欧语言,是现今最通用的单字节编码系统。

  ASCII码使用指定的7位或8位二进制数组合来表示128或256种可能的字符。标准ASCII码也叫基础ASCII码,使用7位二进制数来表示所有的大写和小写字母,数字0到9、标点符号,以及在美式英语中使用的特殊控制字符。

  其中:0~31及127(共33个)是控制字符或通信专用字符(其余为可显示字符),如控制符:LF(换行)、CR(回车)、FF(换页)、DEL(删除)、BS(退格)、BEL(响铃)等;通信专用字符:SOH(文头)、EOT(文尾)、ACK(确认)等;ASCII值为8、9、10 和13 分别转换为退格、制表、换行和回车字符。它们并没有特定的图形显示,但会依不同的应用程序,而对文本显示有不同的影响。

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

  同时还要注意,在标准ASCII中,其最高位(b7)用作奇偶校验位。所谓奇偶校验,是指在代码传送过程中用来检验是否出现错误的一种方法,一般分奇校验和偶校验两种。奇校验规定:正确的代码一个字节中1的个数必须是奇数,若非奇数,则在最高位b7添1;偶校验规定:正确的代码一个字节中1的个数必须是偶数,若非偶数,则在最高位b7添1。

  后128个称为扩展ASCII码。许多基于x86的系统都支持使用扩展ASCII。扩展ASCII 码允许将每个字符的第8 位用于确定附加的128 个特殊符号字符、外来语字母和图形符号。

GB2312

  时代在进步,电脑得到了普及,但是因为咱们中国的文化博大精深,而ASCII码又恰恰无法满足这么多文字的表示。所以在ASCII码的基础下,咱们自己走出了一个编码的新分支。

  1980年,中国国家标准总局年发布了《信息交换用汉字编码字符集》,取名为GB2312标准,其中规定:用两个字节来表示一个汉字,分别为高字节(也称“区字节” 取值范围0xA1-0xF7)和低字节(也称“位字节” 取值范围0xA1-0xFE)。高字节大于127,这样就兼容了ASCII码。

  GB2312大约可以组合出7000多个常用汉字,并且在这些编码里,数学符号、罗马字母、日文的假名等都编进去了,甚至 ASCII 里原本就有的数字、标点、字母都重新编了两个字节长的编码,这就是常说的"全角"字符,而原来在127以下的那些就叫"半角"字符了。

  总之一句话,GB2312 是对 ASCII 码的中文扩展,与后面说到UNICODE和UTF8基本没有联系。题外话:不知道有么有人记得,前些年重要考试时,可能需要先查找自己名字的区字节和位字节,进行相应的涂卡才能考试,有些人的名字比较生僻,就悲催了。

GBK

  继续在咱们自己的标准分支上前进,GB2312只解决了大多数常用文字,所以继续规定:只要第一个字节是大于127就固定表示这是一个汉字的开始,不管后面跟的是不是扩展字符集里的内容,扩展之后的编码方案被称为GBK标准,GBK包括了GB2312的所有内容,同时又增加了近20000个新的汉字(包括繁体字)和符号.

UNICODE

  重点来了,因为当时各个国家都像中国这样搞出了一套自己的编码标准,结果互相之间谁也不懂谁的编码,谁也不支持别人的编码,正所谓:统一是大势所趋,地球正在逐渐变小。

  国际标准化组织(ISO)决定插手了,解决办法就是废弃所有的地区性编码方案,重新统一编写包含所有文化、字母和符号的编码,于是在1994年正式发布了统一编码标准,取名UNICODE(Universal Multiple-Octet Coded Character Set",简称 UCS,万国码),它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。

  UNICODE规定用两个字节,也就是16位来统一表示所有的字符。对于ASCII码里的那些“半角”字符,UNICODE保持其原编码不变,只是将其长度由原来的8位扩展为16位,而其他文化和语言的字符则全部重新统一编码。在UNICODE中,一个字符就是两个字节。

  需要注意的是,Unicode只是一个符号集,它只规定了符号对应的二进制代码,却没有规定这个二进制代码应该如何存储和传输,所以市面上有许多关于Unicode编码存储和传输的实现方式,比如UTF-8,UTF-16等等。

  实现方式就是一种规则。汉字”严”的Unicode16进制码为4E25,转换成二进制数为(0100 1110 0010 0101),通过制定一定的规则,实际存储中,汉字“严”在内存中就可能表示为(0101 0001 1101,这个是随便写的)。但不管是怎样的转换,计算机都会根据这个规则,将(0101 0001 1101)识别为汉字“严”,可能说的有点绕,只可意会不可言传啊。UTF-8就是互联网上使用最广的一种实现Unicode的方式和规则。

UTF-8

  UTF(UnicodeTransformationFormat,Unicode的转换格式)是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。

  UTF-8的编码规则很简单,只有二条:

  1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。

  2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。

  下表总结了编码规则,字母x表示可用编码的位。

  Unicode符号范围 | UTF-8编码方式

  (十六进制) | (二进制)

  ----------------------------------------------------------------------------

  0000 0000-0000 007F | 0xxxxxxx

  0000 0080-0000 07FF | 110xxxxx 10xxxxxx

  0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx

  0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

  -----------------------------------------------------------------------------

  跟据上表,解读UTF-8编码非常简单。如果一个字节的第一位是0,则这个字节单独就是一个字符;如果第一位是1,则连续有多少个1,就表示当前字符占用多少个字节。

  下面,还是以汉字"严"为例,演示如何实现UTF-8编码。

  已知"严"的unicode是4E25(100111000100101),根据上表,可以发现4E25处在第三行的范围内(0000 0800-0000 FFFF),因此"严"的UTF-8编码需要三个字节,即格式是"1110xxxx 10xxxxxx 10xxxxxx"。然后,从"严"的最后一个二进制位开始,依次从后向前填入格式中的x,多出的位补0。这样就得到了,"严"的UTF-8编码是"11100100 10111000 10100101”(红字合成后就是unicode编码),转换成十六进制就是E4B8A5。

引申

  存储和传输就必须讨论“大端模式”和“小端模式”,只有保证解读数据一致性,才能确保不出现数据错误和乱码。

  大端模式(Big_endian):数据的高字节存储在低地址中,而数据的低字节则存放在高地址中。

  小端模式(Little_endian):数据的高字节存储在高地址中,而数据的低字节则存放在低地址中。

  Unicode规范中定义,每一个文件的最前面分别加入一个表示编码顺序的字符,这个字符的名字叫做"零宽度非换行空格"(ZERO WIDTH NO-BREAK SPACE),用FEFF表示。这正好是两个字节,而且FF比FE大1。

  如果一个文本文件的头两个字节是FEFF,就表示该文件采用大端方式;如果头两个字节是FFFE,就表示该文件采用小端方式。

  PS:参考阮一峰著作,感兴趣的朋友,请点这里

ASCII&UNICODE编码演化的更多相关文章

  1. ASCII\UNICODE编码的区别

    前几天,Google给我Hotmail邮箱发了封确认信.我看不懂,不是因为我英文不行,而是"???? ????? ??? ????"的内容让我不知所措.有好多程序员处理不好编码问题 ...

  2. (转自知乎)Unicode编码

    很多人都把Unicode编码挂在嘴边,其实咱们现实生活中遇到的编码基本都是Unicode的 因为Unicode兼容了大多数老版本的编码规范例如 ASCII Unicode编码定义了这个世界上几乎所有字 ...

  3. SQL Server 中怎么查看一个字母的ascii编码或者Unicode编码

    参考文章:微信公众号文章 在sql中怎么查看一个字符的ascii编码,so easy !! select ASCII('a') SELECT CHAR(97) charNum SELECT UNICO ...

  4. 理解记忆三种常见字符编码:ASCII, Unicode,UTF-8

    理解什么是字符编码? 计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数就是25 ...

  5. 【转】关于字符编码,你所需要知道的(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 ...

  6. 【转】【编码】ANSI,ASCII,Unicode,UTF8之一

          不同的国家和地区制定了不同的标准,由此产生了 GB2312.GBK.GB18030.Big5.Shift_JIS 等各自的编码标准.这些使用多个字节来代表一个字符的各种汉字延伸编码方式,称 ...

  7. ASCII与Unicode编码消息写文件浅析

    [文章摘要] ASCII与Unicode是两种常见的字符编码. 它们的表示方法不一样,因而在程序中就要差别处理. 本文基于作者的实际开发经验,对ASCII与Unicode两种字符编码消息的写文件过程进 ...

  8. ASCII, Unicode, UTF-8, 8进制, 16进制等各种编码学习理解笔记

    字符编码的发展历史 Unicode和UTF-8有何区别? 在这个问题下的于洋的最高票回答中,比较完整地介绍了字符编码的发展历史,为了便于记忆,再次简要概括一番. 一个字节:最初一个字节的标准是混乱的, ...

  9. ASCII,unicode, utf8 ,big5 ,gb2312,gbk,gb18030等几种常用编码区别(转载)

    原文出处:http://www.blogjava.net/xcp/archive/2009/10/29/coding2.html 最近老为编码问题而烦燥,下定决心一定要将其弄明白!本文主要总结网上一些 ...

随机推荐

  1. Kotlin集合——Map集合

    Kotlin集合——Map集合 转 https://www.jianshu.com/p/da5cc9072f1e Kotlin的Map集合用于保存key-value对,其也被分为可变的和不可变的. 一 ...

  2. 禁止select标签选择,禁止select组件change值

    大家知道, 对于HTML控件select, 是没有readOnly属性的,所以设置它并不起作用,如: 如果用disabled的话,提交时又取不到值. 那有什么方法可以实现?可以有一个折中的方法,如下: ...

  3. vue的vuex在使用...mapState 和...mapGetter报错的解决方案

    from:https://blog.csdn.net/ysterling/article/details/88145765 采用mapState 和mapGetter,在页面使用时报错,这是因为bab ...

  4. DEX-6-caffe模型转成pytorch模型办法

    在python2.7环境下 文件下载位置:https://data.vision.ee.ethz.ch/cvl/rrothe/imdb-wiki/ 1.可视化模型文件prototxt 1)在线可视化 ...

  5. layui时间控件闪退的问题

    项目上线,发现后台管理系统layui的子页面出现时间控件闪退的问题,根本选取不到时间. 其原因是:如果出现页面找到多个节点,只有第一个节点能正常使用后面的节点都会闪退,可以理解为目前laydate不支 ...

  6. Promise.resolve的作用

    Promise.resolve方法有下面三种形式: Promise.resolve(value); Promise.resolve(promise); Promise.resolve(thenable ...

  7. 基于grafana+prometheus构建Flink监控

    先上一个架构图 Flink App : 通过report 将数据发出去 Pushgateway :  Prometheus 生态中一个重要工具 Prometheus :  一套开源的系统监控报警框架 ...

  8. sklearn简单线性回归

    from sklearn import datasetsfrom sklearn.model_selection import train_test_splitfrom sklearn.linear_ ...

  9. JS获当前网页元素高度offsetHeight

    本文测试的是offsetHeight,获取网页中某元素的高度,单位是像素,获取的类型是整型,可以进行数字运算.如图,网页中的元素本身的高度包括,自身的内容+padding+border,而margin ...

  10. web端调起Windows系统应用程序(exe执行文件),全面兼容所有浏览器

    1. 首先,你要有一个exe可执行文件2. 创建注册表创建注册表有两种方式(以“MyApp.exe”为例): 方式一:可视化编辑Win+R 打开运行,输入 regedit 并回车,进入注册表编辑器新建 ...