0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

从ASCII码->Unicode-> UTF-8历史变迁,及其差异

黄工的嵌入式技术圈 来源:黄工的嵌入式技术圈 作者:黄工的嵌入式技术 2020-02-27 15:56 次阅读

说到ASCII,Unicode和UTF-8,可能大家都知道是字符编码,但具体含义,以及其中差异,可能很多人都不知道。 一、名称解释ASCII:AmericanStandardCode forInformationInterchange,美国信息互换标准代码。 Unicode:统一码、万国码、单一码,是计算机科学领域里的一项业界标准,包括字符集、编码方案等。 UTF-8:8-bit Unicode Transformation Format,是一种针对Unicode的可变长度字符编码。 二、历史变迁先给大家看一张变迁图:

很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物。他们看到8个开关状态是好的,于是他们把这称为“字节”。再后来,他们又做了一些可以处理这些字节的机器,机器开动了,可以用字节来组合出很多状态,状态开始变来变去。他们看到这样是好的,于是它们就这机器称为”计算机“。 开始计算机只在美国使用,八位的字节一共可以组合出256种不同的状态。他们把其中的编号从0开始的32种状态分别规定了特殊的用途,一但终端、打印机遇上约定好的这些字节被传过来时,就要做一些约定的动作。遇上0×10, 终端就换行,遇上0×07, 终端就向人们嘟嘟叫。他们看到这样很好,于是就把这些0×20以下的字节状态称为“控制码”。他们又把所有的空格、标点符号、数字、大小写字母分别用连续的字节状态表示,一直编到了第127号,这样计算机就可以用不同字节来存储英语的文字了。大家看到这样,都感觉很好,于是大家都把这个方案叫做ANSI。 后来,世界各地都开始使用计算机了,但是很多国家用的不是英文,他们的字母里有许多是ASCII里没有的,为了可以在计算机 保存他们的文字,他们决定采用 127号之后的空位来表示这些新的字母、符号,还加入了很多画表格时需要用下到的横线、竖线、交叉等形状,一直把序号编到了最后一个状态255。从128 到255这一页的字符集被称“扩展字符集”。 等中国人们得到计算机时,已经没有可以利用的字节状态来表示汉字,而且常用汉字有六七千个,这个时候,中国人民就使用了一套汉字方案叫做GB2312”。随着发展,又发现了一些局限,所以就有了GBK,再继续往后增加了一些字符(如少数名族字体),GBK扩成了GB18030。

因为当时各个国家都像中国这样搞出一套自己的编码标准,结果互相之间谁也不懂谁的编码,谁也不支持别人的编码,连大陆和***这样只相隔了150海里也使用不同编码。这个时候,出现了一个叫 ISO 组织(国际标准化组织)决定着手解决这个问题。他们采用的方法很简单:废了所有的地区性编码方案,重新搞一个包括了地球上所有文化、所有字母和符号 的编码!他们打算叫它“Universal Multiple-Octet Coded Character Set”,简称 UCS, 俗称 “Unicode”。

但是Unicode同样也有2个问题:

1.计算机怎么知道二个字节为一个字符,如何识别二个字节为什么一个字符?

2.针对英文字符,如果使用大于1个字节来表示,那么低位的前面几个字节全是0。很奢侈浪费空间,因为现在计算机大部分内容还是英文。

unicode在很长一段时间内无法推广,直到互联网的出现,为解决unicode如何在网络上传输的问题,于是面向传输的众多UTF(UCS Transfer Format)标准出现了。顾名思义,UTF-8就是每次8个位传输数据,而UTF-16就是每次16个位。UTF-8就是在互联网上使用最广的一种unicode的实现方式,这是为传输而设计的编码,并使编码无国界,这样就可以显示全世界上所有文化的字符了。 三、Charset and Encoding

1.什么是字符编码Charset (Character set) 字符集:是对字符抽象表示的集合。包括世界上各种文字、符合和字符。 字符集只是一个规则集合的名字,对应到真实生活中,字符集就是对某种语言的称呼。例如:英语,汉语,日语。 2.什么是字符编码对于一个字符集来说要正确编码转码一个字符需要三个关键元素:字库表(character repertoire)、编码字符集(coded character set)、字符编码(character encoding)。

字库表是一个相当于所有可读或者可显示字符的数据库。字库表决定了整个字符集能够展现表示的所有字符的范围。编码字符集,即用一个编码值code point来表示一个字符在字库中的位置。字符编码,将编码字符集和实际存储数值之间的转换关系。 四、UTF-8和Unicode的关系看完上面两个概念解释,相信你应该明白其中关系了。Unicode就是上文中提到的编码字符集,而UTF-8就是字符编码,即Unicode规则字库的一种实现形式。随着互联网的发展,对同一字库集的要求越来越迫切,Unicode标准也就自然而然的出现。它几乎涵盖了各个国家语言可能出现的符号和文字,并将为他们编号。

五、进一步理解UTF-8编码UTF-8编码为变长编码。最小编码单位(code unit)为一个字节。一个字节的前1-3个bit为描述性部分,后面为实际序号部分。

1.如果一个字节的第一位为0,那么代表当前字符为单字节字符,占用一个字节的空间。0之后的所有部分(7个bit)代表在Unicode中的序号。

2.如果一个字节以110开头,那么代表当前字符为双字节字符,占用2个字节的空间。110之后的所有部分(5个bit)加上后一个字节的除10外的部分(6个bit)代表在Unicode中的序号。且第二个字节以10开头。

3.如果一个字节以1110开头,那么代表当前字符为三字节字符,占用3个字节的空间。110之后的所有部分(5个bit)加上后两个字节的除10外的部分(12个bit)代表在Unicode中的序号。且第二、第三个字节以10开头。

来看一个UTF-8编码例子:

发现其中规律:1个字节的UTF-8十六进制编码是以比8小的数字开头的 2个字节的UTF-8十六进制编码是以C或D开头的 3个字节的UTF-8十六进制编码是以E开头的 本文就写到这里,希望对你有帮助。当然,更多关于字符编码的内容,感兴趣朋友可以自行了解。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • ASCII
    +关注

    关注

    4

    文章

    168

    浏览量

    34507
  • Unicode
    +关注

    关注

    0

    文章

    23

    浏览量

    12506
  • UTF-8
    +关注

    关注

    0

    文章

    13

    浏览量

    7816
收藏 人收藏

    评论

    相关推荐

    用CubeMx创建了Freertos,工程Middlewares->Tgird_Party->FreeRTOS ->Souce下面只有几个空文件夹为什么?

    我用CubeMx创建了Freertos,发现在工程的Middlewares->Tgird_Party->FreeRTOS -&
    发表于 03-28 06:20

    怎么将pMCI[M1]->pSTM->bState 的 IDLE_START传递给STM[M1]->bState的?

    ] );// STM[M1]->bState switch ( StateM1 ) { case IDLE_START: 看了很多遍都没发现是怎么将 pMCI[M1]-&
    发表于 03-27 07:56

    Open RAN的未来及其对AT&T的意义

    3月14日消息,在“Connected America 2024”会议上,AT&T高级副总裁兼网络首席技术官Yigal Elbaz讨论了Open RAN 的未来及其对AT&T的意义。
    的头像 发表于 03-14 14:40 175次阅读

    采用UTF8UTF16都无法使用中文SSID怎么解决?

    采用 UTF8UTF16都无法使用中文SSID 将wifi ssid设置为 \" test12 \",分别用了以下 3种 unicode编解码格格式,测试情况分分如下: 1.格式一:UT
    发表于 02-29 06:36

    单片机也可以轻松玩转UTF-8码和TTF字体了

    要让智能设备支持各国不同的文字,首先得有支持全球文字的编码集,时下最出名的要数UTF-8码了。
    的头像 发表于 11-23 17:18 1568次阅读
    单片机也可以轻松玩转<b class='flag-5'>UTF-8</b>码和TTF字体了

    ADXL362:微电、3轴、2 < em&gt;g < em&gt;g/em&gt;/%4 <em&gt;g </em&gt;/%8 <em&gt;g/em&gt;g/em &gt; 数字输出MEMS加速仪数据表 ADI

    电子发烧友网为你提供ADI(ADI)ADXL362:微电、3轴、2 < em&gt;g < em&gt;g/em&gt;/%4
    发表于 10-09 19:06
    ADXL362:微电、3轴、2 < em&<b class='flag-5'>gt</b>;g < em&<b class='flag-5'>gt</b>;g/em&<b class='flag-5'>gt</b>;/%4 <em&<b class='flag-5'>gt</b>;g </em&<b class='flag-5'>gt</b>;/%8 <em&<b class='flag-5'>gt</b>;g/em&<b class='flag-5'>gt</b>;g/em &<b class='flag-5'>gt</b>; 数字输出MEMS加速仪数据表 ADI

    IAR中UTF-8中文字符串不显示怎么解决?

    界面使用的是ucGUI原本使用GB2312编码的中字符串可以直接读取显示,字库也用FontCvt做了初始化的时候也添加了GUI_UC_SetEncodeutf8();函数 后面换成UTF-8的中文字
    发表于 10-07 07:11

    unicode如何转GBK字库制作

    UTF-8(8 位元,Universal Character Set/Unicode Transformation Format)是针对 Unicode 的一种可变长度字符编码。UCS 字符
    发表于 08-14 10:45 14次下载

    编译mdk项目报error:source file is not valid UTF-8错误是什么情况

    使用官方的例呈项目以及自己应该cubemx配置的项目都会报错,source file is not valid UTF-8,并有大量的警告,warning:null character ignored,使用的是u5a9芯片, 而配置其他芯片 如 G030的芯片就能正常编译!请问是什么情况?
    发表于 08-05 07:25

    你使用shell脚本中的2&amp;gt;&amp;amp;1了吗?

    run_cmax &gt; ./starrc_cmax.logs 2&gt;&amp;1中的 2&gt;&amp;1是啥意思?
    的头像 发表于 07-30 14:44 1045次阅读

    请问SYS-&amp;gt;GPB_MFP和 SYS-&amp;gt;ALT_MFP有啥区别?

    for TM0_EXT */ SYS-&amp;gt;GPB_MFP &amp;amp;= ~(SYS_GPB_MFP_PB8_Msk
    发表于 06-19 08:03

    LuaLoader -&amp;gt; 通信错误的原因?

    我用最新的固件刷新了我的 ESP8266,现在这个 -&amp;gt;“通信错误 - 检查波特率”&amp;lt;- 是我用 LuaLoader 得到的唯一东西。 putty @9600 的串行输出
    发表于 05-10 06:39

    位于ETPU配置 &amp;gt; cpu &amp;gt; etpu_set.h的微代码是否是编译生成的正确代码?

    奇eTPU项目中的编译。 根据参考资料,etpuc 文件的编译创建了微代码。 位于 ETPU 配置 &amp;gt; cpu &amp;gt; etpu_set.h 的微代码是否是编译
    发表于 05-04 07:45

    K32L2A31A写入LPSPI0-&amp;gt;TDR的硬故障怎么解决?

    ) | LPSPI_TCR_PRESCALE(4) | LPSPI_TCR_TXMSK_MASK | LPSPI_TCR_CONT_MASK; //16bit Transfer LPSPI0-&amp;gt;TDR = (uint32_t)(0x20&
    发表于 04-28 06:58

    如何为guiguider添加mime类型以及.guiguider文件打开文件/项目的能力?

    /application-x-guiguider.xml &amp;lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&amp;gt; 不幸的是
    发表于 04-25 07:25