从字符集发展史看Unicode和UTF-8的区别

从字符集发展史看Unicode和UTF-8的区别

版权声明

本文并非本人原创,其内容来源于网络,本文根据其演绎而来,具体出出已经无法考证,在这里只好给出我所参考的连接。

ASCII编码

我们都知道计算机来源于美国,并且计算机它比较笨,只知道 01 也就是电路的通和断(0或1即是一个二进制位)。那么美国人怎么使用计算机来存储他们的信息呢? 他们想了一个办法。将8个二进制位视为一组--也就是一字节(8bit=1byte). 1byte能够标表示 256 个数字数据范围是 0-255。 就这样每一个数字就人为地赋予一个意思,比如 10 就代表换行,41 就代表大写字母 A。而0-31 都是一些特殊的字符,这些字符在古老的时候用来控制终端(比如说打印机)的行为。而从32 - 127 就代表一些实意的字符。0 到 127 就正好能够将所有的英文的字符都囊括进来,所以美国人就可以很开心的使用计算机了。

计算机的不断发展

在后来,越来越多的国家都开始使用计算机了,但是有些国家可能有自己的语言并不是英语,那么现在现有的ASCII编码已经不适用了。那么怎么办呢? 现有的ASCII编码还有将所有的位置都占满,所以非英语的国家都开始扩张ASCII编码的编码集,陆陆续续的将 127 之后的字符都渐渐地用上了。这时候计算机仍然在迅速地在全球蔓延。

迟到的中国

在中国引入了计算机时,ASCII编码0-255都已经被先来的国家给占据了,已经没有给中文留位置了。怎么办呢? 那咱中国就搞自己的字符集。在一些大佬们的努力下想出了一个解决方案--扩展ASCII编码。废除了127之后的所有的后来添加的字符,保留原有的英文字符。并且扩展了原有的ASCII的编码规则,原来的ASCII编码规则是 1byte代表一个字符,但是这已经不适用咱们国家了,所以又加了一个byte,两个byte代表一个中文字符。那么如何判断二进制是一个中文字符还是一个英文字符呢?

新的编码规则是这样规定的(两个>127的byte标识一个汉字),如果一个byte>127 那么就表明,这是一个中文字符的第一个字节(被称为高位字节),那么一个高位字节和一个高位字节就代表一个中文字符;而如果一个byte的值<=127那么这一个byte就代表一个英文字符。

就这样我们的新的字符集已经形成了,它被称为 GB2313 ,其扩展了ASCII编码集,实现了汉字的存储,GB2312一个可以存储6000多个常用的中文字符了甚至还存储了一些数学符号和日本的片假字还有英文符号的具有高位字节的标识形式--也就是 全角字符 而原来的英文符号被称为 半角字符

这也就是为什么我们常说: 一个汉字占两个字节,一个英文占一个字节。

GB2312不够用了

GB2313编码解决了中文字符输入的问题,但是只有6000多个常用字,那么就导致很多生僻字是没有在字符集里面的,?? 然而,我们都知道,很多人的名字中都会有一些生僻字的,这就比较绝望了,GB2312 还得进行扩展。

原来的GB2312的 高位字节和低位字节规定的都得是 127 之后的数字,现在干脆不规定低位字节必须得大于 127 的,现在的心的字符集已经被大大地扩展了, 不仅仅是简体字被包括了进来并且繁体字也被包括过来了---这一编码被称为 GBK 编码。

紧接着计算机又逐渐地普及,少数民族也开始需要使用计算机了,每个民族都有自己的文字并且都需要在计算机中存储。现有的GBK编码集中还没有少数民族的文字,所以有进行了一次扩展,进的编码规则被称为 GB18030。现在我们祖国的文化知识已经可以在计算机中流传了。

后再这些编码被中国的程序员们统称为 DBCS(Double Byte Charecter Set 双字节字符集)。

Unicode的诞生

计算机已经在世界范围内普及了,但是国家与国家之间的信息的交换出现了一些问题。因为每个国家都有自己的编码格式,大家之间互相不理解,设置就连我国大陆地区和我国的台湾地区也不兼容。国与国之间信息的交换称为了问题。

这是或ISO组织站出来准备解决这个问题,解决方式很简单: 他废除了所有的编码格式,全球统一的编码---Universal Multiple-Octet Coded Character Set 简称为 UCS 我们俗称为 Unicode。他还有一个响亮的 Chinese Name 叫做 万国码

Unicode编码的规则是,不管是不是英文字符都占有两个 byte ,我们知道英文字符只需要占一个byte就行了,而Unicode规定在高位字节进行补0。

UTF-8

通过Unicode,我们解决了国家与国家之间的信息的流通,但是Unicode有一个非常显著地缺点---不管是不是英文字符都会占两个byte。大家都知道计算机中大量存储地字符还是英文字符,而英文字符之外的字符只占据了一部分。使用Unicode就造成了存储和传输的资源的浪费。

因为Unicode的缺点,所以在很长的时间里没办法进行推广,直到互联网的产生,为了解决Unicode编码在网络上传输的问题,很多 UTF(UCS Transfer Format) 标准出现了, 比如 UTF-8和UTF-16,顾名思义,UTF-8 就是以8位传输数据,UTF16就是以18位传输数据。UTF-8是使用的广泛的Unicode的实现方式。

UTF-8 的最大特点是,它是一个 变长 的编码方式,UTF-8 会根据字符的不同采用 1-4个字节来表示。如果在ASCII编码范围内的话就通过一个字节来表示,否则则通过多个字节来表示。在Unicode中一个中文占据两个字节,而在UTF-8编码中,一个中文字符占3个字节。UTF-8和Unicode并不是直接对应的,在这之间需要通过一系列的算法转化。

总结

从这本文我们大家已经明白了Unicode和UTF-8的区别了

  • ASCII,GB2312,Unicode是一种字符集也是一种编码方式
  • UTF-8只是Unicode字符集的一种实现方式,UTF-8只是一种编码格式,而不是一个字符集。

原文地址:https://www.cnblogs.com/slyfox/p/9760372.html

时间: 2024-08-25 08:14:51

从字符集发展史看Unicode和UTF-8的区别的相关文章

**字符集--发展史

字符集--发展史 很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物.他们看到8个开关状态是好的,于是他们把这称为"字节".再后来,他们又做了一些可以处理这些字节的机器,机器开动了,可以用字节来组合出很多状态,状态开始变来变去.他们看到这样是好的,于是它们就叫这机器称为"计算机".开始计算机只在美国用.八位的字节一共可以组合出256(2的8次方)种不同的状态. 他们把其中的编号从0开始的32种状态分别规定了特殊的用途,一但终

从状态模式看“大神”和“菜鸟”的区别

<大话设计模式>中讲状态模式这一节名字叫做"无尽加班何时休-状态模式".菜鸟由于编程经验不足,解决问题的能力不够而不得不牺牲时间去不断的写代码结果还是反复出错.而大神每次都能深入到问题的根源运用自己的思想去写代码,每个问题都完美的解决. 加班的菜鸟一天各个时间段状态都不一样,从开始的精神百倍到越来越疲惫.自己写出的代码不断带来问题. 代码是程序员思维智慧的结晶,菜鸟"程序员没有将自己的思维融入代码写出来的是这样的: class Program { static v

面试前必看:Redis 和?Memcached 的区别

面试前必看:Redis 和 Memcached 的区别 2016-07-07 程序员的那些事 (点击上方公众号,可快速关注) 来源:标点符 链接:http://www.biaodianfu.com/redis-vs-memcached.html 主页君注:这篇文章前几天在「数据库开发」推荐后,有位童鞋评价非常高:「写的很不错,面试前必看」. Redis 的作者 Salvatore Sanfilippo 曾经对这两种基于内存的数据存储系统进行过比较: Redis支持服务器端的数据操作:Redis相

ascii、unicode、utf、gb等编码详解

很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物.他们看到8个开关状态是好的,于是他们把这称为"字节".再后来,他们又做了一些可以处理这些字节的机器,机器开动了,可以用字节来组合出很多状态,状态开始变来变去.他们看到这样是好的,于是它们就这机器称为"计算机". 开始计算机只在美国用.八位的字节一共可以组合出256(2的8次方)种不同的状态. 他们把其中的编号从0开始的32种状态分别规定了特殊的用途,一但终端.打印机遇上约定

Unicode、UTF-8 和 ISO8859-1到底有什么区别

说明:本文转载于新浪博客,旨在方便知识总结.原文地址:http://blog.sina.com.cn/s/blog_673c81990100t1lc.html 本文主要包括以下几个方面:编码基本知识,java,系统软件,url,工具软件等. 在下面的描述中,将以"中文"两个字为例,经查表可以知道其GB2312编码是"d6d0 cec4",Unicode编码为"4e2d 6587",UTF编码就是"e4b8ad e69687".

多字符集(ANSI)和UNICODE及字符串处理方式准则

在我们编写程序的时候,使用最多的是字符串的处理,而ANSI和UNICODE的相互转换经常搞的我们头晕眼乱. 应该说UNICODE是一种比较好的编码方式,在我们的程序中应该尽量使用UNICODE编码方式,我们在编写程序的时候,最好能依据下面的准则来进行: 基本准则: 1.将文本字符串想象为字符数组,而非char或字节数组 2.开始使用通用数据类型来表示文本字符和字符串(如TCHAR,PTSTR) 原因是我们可以在WinNT.h的头文件中找到如下定义(代码有删改): [cpp] view plain

简单的看Unicode和UTF-8的区别

作者:uuspider链接:http://www.zhihu.com/question/23374078/answer/65352538来源:知乎著作权归作者所有,转载请联系作者获得授权. 举一个例子:It's 知乎日报 你看到的unicode字符集是这样的编码表: I 0049 t 0074 ' 0027 s 0073 0020 知 77e5 乎 4e4e 日 65e5 报 62a5 每一个字符对应一个十六进制数字. 计算机只懂二进制,因此,严格按照unicode的方式(UCS-2),应该这样

Unicode 与 UTF

[UCS]   Universal Character Set (通用字符集) [UCS]   Unicode Character Set  (Unicode字符集) [UTF-8]Unicode/UCS Transformation Format-8 说明,由于UTF也适用于编码通用字符集UCS,故亦可称为『UCS transformation formats (UTF)』 Unicode(统一码.万国码.单一码)是一种在计算机上使用的字符编码.它是基于通用字符集(Universal Char

难分难解的字符集ASCII、Unicode、UTF-8 ---- 如果你也感到困惑,赶紧来围观

闲来无事学习一下Python,在看到关于Python字符类型的时候有提到字符集,字符集的问题我一直没搞明白,ASCII.Unicode.UTF-8之间有什么区别呢?借着这个机会总算是有了一点点的明白,记录下来,学习一下. 谈到字符集的人,肯定是跟计算机打交道的人,由于计算机只能处理数字,没有人类这么超高的智慧,如果计算机需要处理文本,那就必须把文本转换成数字.那么问题来了:如何实现把文本转换成数字这个过程呢?聪明的人类想到了字符集.最早的计算机在设计时采用8个比特(bit)作为一个字节(byte