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
    +关注

    关注

    5

    文章

    172

    浏览量

    36475
  • Unicode
    +关注

    关注

    0

    文章

    25

    浏览量

    12869
  • UTF-8
    +关注

    关注

    0

    文章

    13

    浏览量

    8068
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    如何使用 UTF-8 编码?

    如何使用 UTF-8 编码?
    发表于 09-04 06:21

    重复执行 Ctrl->Bulk 传输时,出现 USBD_STATUS_INVALID_PARAMETER 错误,怎么解决?

    问.1重复执行 Ctrl->Bulk 传输时,出现 USBD_STATUS_INVALID_PARAMETER 错误。 ·USBD_STATUS_CANCEL 发生
    发表于 08-14 06:39

    求助:AMC架构运行报错:错误537056发生于 AMC.lvlib:Send Message.vi:2810005->AMC.lvlib:Create Message Queue.vi->manual.vi

    错误537056发生于 AMC.lvlib:Send Message.vi:2810005->AMC.lvlib:Create Message Queue.vi-&gt
    发表于 08-06 10:03

    【创龙TL3562-MiniEVM开发板试用体验】8、FreeType显示矢量文字

    (utf_8_size > 0){ //1位utf_8转换为两位的unicode if(u
    发表于 08-05 11:54

    《仿盒马》app开发技术分享-- 首页地址选择&会员8

    ;, subWindowEnabled: false }; sceneMap.selectDistrict(getContext(this), districtSelectOptions).then((data) =&gt
    发表于 06-29 23:49

    F103RCT6芯片对AFIO->MAPR寄存器写入时出错了怎么解决?

    ;amp;amp;= 0xF8FFFFFB; AFIO->MAPR |=
    发表于 06-04 06:35

    F103RCT6芯片对AFIO->MAPR寄存器写入时出错的原因?

    ;amp;amp;= 0xF8FFFFFB; AFIO->MAPR |=
    发表于 04-27 06:37

    F103RCT6芯片对AFIO->MAPR寄存器写入时出错怎么解决?

    = 0xF8FFFFFB; AFIO->MAPR |= 0x02000000;//开启SW-DP,关闭JTAG-DP AFIO-&
    发表于 04-22 13:29

    k32l2b31写入LPUART1->STAT |= (1<<25)会导致semihost_hardfault是为什么?

    我想在 k32l2b31 上激活 LIN Break 检测 必须在状态寄存器中设置位 LKDE i try LPUART1->STAT |= (1<&amp
    发表于 04-08 06:36

    LCD_SPI_X->DAT = (uint16_t)dat; while((LCD_SPI_X->STS & SPI_I2S_BUSY_FLAG)!=(uint16_t)RESET){}

    LCD_SPI_X->DAT = (uint16_t)dat; while((LCD_SPI_X->STS &amp
    发表于 04-02 14:29

    求购安捷伦3458A —>8.5 位数字万用表

    【安立】、MARCONI【马可尼】、chroma【可罗马】、Extech【华仪】等! 地址:广东省东莞市塘厦镇塘厦大道北445号钜业大厦五楼528号纪先生:I8O86III968//I35>37833&
    发表于 03-15 09:24

    使用DLPC350投射格雷时,当切换pattern频率>10frame/s,出现了图像重叠的问题怎么解决?

    你好,我在使用DLPC350 投射格雷8bit深度)时,当 切换pattern频率 > 10frame/s,出现了
    发表于 02-21 16:03

    远翔降压恒流驱动芯片FP7153布板建议说明以及电磁抗干扰EMI认证对策分析

    布板说明>大電流路徑走線要粗,鋪銅走線最佳。>開關切換連接點ICSW與L1,走線要短與粗,鋪銅走線最佳。&amp
    的头像 发表于 02-10 14:28 616次阅读
    远翔降压恒流驱动芯片FP7153布板建议说明以及电磁抗干扰EMI认证对策分析

    智能驾驶数据采集回注测评工具 - ARS

    在数据驱动智能驾驶的时代背景下,开发者们总结了一条适用于智能驾驶的数据闭环开发流程,这条开发线路大致包括实车数据采集->数据存储->数据处理-&
    的头像 发表于 01-15 17:50 1663次阅读
    智能驾驶数据采集回注测评工具 - ARS

    使用ads5407的test pattern的时候,设置为输出555->AAA和000->FFF的时候某些管脚输出不正确,为什么?

    您好,在使用ads5407的test pattern的时候,当设置为全部输出为0和全部输出为1的时候,功能正确;但是当我设置为输出555->AAA和000-&amp
    发表于 01-07 08:24