自从上次发布“Framebuffer应用编程”视频后,

我们花了10多天调试STM32MP157板子,4.19内核、5.4内核全部调试通过!

在调试过程中,编写了不少文档,到时整理后再发布给大家,也许可以录一个项目:

怎么把厂家SDK移植到到自己的板子?

这是以后的事了,

从今天开始,韦老师又继续录制、发布视频了。

今天发布文章:字符的编码方式,视频同步录制中。

6.1 字符的编码方式

6.1.1 编码与字体

在计算机上,我们看到的字符“A”可能长这样:

也可能长这样:

对于同一个TXT文件中的内容,你在Notepad上选择不同字体时,字符显示的形状不一样。所以TXT文件中保存的是字符的核心:它的编码值。而Notepad上显示时,这些字符对应什么样的形状态,这是由字符文件决定的。

编码值,字体是两个不一样的东西,比如A的编码值是0x41,但是在屏幕上显示出来时可以使用不同的形状。

什么叫编码?就是一个字符用什么数字来表示。在计算机里一切都是用数字来表示,比如字符A,用0x01还是0x02来表示它?我们使用0x41来表示它。当你去打开一个TXT文件时,发现里面含有数值0x41,你就知道了:哦,这里有一个字符A。

一个字符用哪个数字来表示?有很多标准,举例讲解。

1. ASCII

它是“American Standard Code for Information Interchange”的缩写,美国信息交换标准代码。电脑毕竟是西方人发明的,他们常用字母就26个,区分大小写、加上标点符号也没超过127个,每个字符用一个字节来表示就足够了。

一个字节的7位就可以表示128个数值,在ASCII码中最高位永远是0。字符和数值的对应关系可以参考:

https://baike.baidu.com/item/ASCII

下面摘录部分给大家一个印象:

2. ANSI

关于ANSI强烈建议阅读这篇文章:https://www.cnblogs.com/malecrab/p/5300486.html

使用记事本保存文件时,可以选择“ANSI”编码,却没有“ASCII”,如下图所示。怎么回事?

ASNI是ASCII的扩展,向下包含ASCII。对于ASCII字符仍以一个字节来表示,对于非ASCII字符则使用2字节来表示。并没有固定的ASNI编码,它跟“本地化”(locale)密切相关。比如在中国大陆地区,ANSI的默认编码是GB2312;在港澳台地区默认编码是BIG5。

以数值“0xd0d6”为例,对于GB2312编码它表示“中”;对于BIG5编码它表示“笢”。所以对于ANSI编码的TXT文件,如果你打开它发现乱码,那么还得再次细分它的具体编码。比如对于一个TXT文件,里面的数值如下:

使用Notepad打开后,选择不同的编码(或称为字符集),有不一样的显示,如下:

这仅仅是在中国地区就出现这些不兼容的问题。对于不同国家,它们默认的ANSI编码各不相同,所以同一个TXT文件在不同国家就很有可能出现乱码。根本的原理在于没有“统一的编码”,那解决方法自然就是使用“统一的编码”:UNICODE。

3. UNICODE

在ANSI标准中,很多种文字都有自己的编码标准,汉字简体字有GB2312、繁体字有BIG5,这难免同一个数值对应不同字符。比如数值“0xd0d6”,对于GB2312编码它表示“中”;对于BIG5编码它表示“笢”。这造成了使用ANSI编码保存的文件,不适合跨地区交流。UNICODE编码就是为了解决这类问题:

对于地球上任意一个字符,都给它一个唯一的数值。UNICODE仍然向下兼容ASCII,但是对于其他字符会有对应的数值,比如对于“中”、“笢”,它们的数值分别是:0x4e2d、0x7b22 UNICODE中的数值范围是0x0000至0x10FFFF,有1,114,111即100多万个数值,可以表示100多万个字符,足够地球人使用了。

6.1.2 编码实现

所谓编码实现,就是对于一个数值,怎么表示它。这很奇怪,数值还能怎么表示?比如“中”的UNICODE值是0x4e2d,在TXT文件中怎么表示0x4e2d?直接写入0x4e2d?不行!比如在TXT文件中写入2字节数据“0x2d 0x4e”,它可以用来表示“中”字吗?不能!它们对应ASCII字符“-N”。

问题的关键在于:怎么断字。在TXT文件中,2字节数据“0x2d 0x4e”是作为一个整体看待,还是拆成2部分看待?所以,需要用一定的技巧来表示数值,这就对应不同的编码实现。

现在我们知道:

  1. ASCII编码中使用一个字节来表示一个字符,只用到其中的7位,最高位恒为0;
  2. ANSI编码中,对于ASCII字符仍使用一个字节来表示(BIT7是0),对于非ASCII字符一般使用2个字节来表示,非ASCII字符的数值BIT7都是1。
  3. UNICODE:这就有点复杂了,下面一一讲解。

先用记事本新建3个文件:utf-16_le.txt、utf-16_be.txt、utf-8.txt、bom_utf-8.txt,里面的内容都是“ab中”,保存时编码分别选择“UTF-16 LE”、“UTF-16 BE”、“UTF-8”、“带有BOM的UTF-8”,下图是其中一个例子:

怎么表示一个UNICODE数值?

1. 使用3个字节表示一个UNICODE

不,太浪费。UNICODE的最大值是0x10FFFF,那使用3个字节来表示一个UNICODE数值?这当然是很省事的方法,但是会造成浪费,比如字符A的UNICOCDE值是0x41,难道也用“0x41 0x00 0x00”这3个字节来表示?

2. UCS-2 Little endian/UTF-16 LE

每个UNICODE值用3字节来表示有点浪费,那只用2字节呢?它可以表示2^16=65536个字符,全世界常用的字符都可以表示了。Little endian表示小字节序,数值中权重低的字节放在前面,比如字符“ab中”在TXT文件中的数值如下,其中的“a”使用“0x61 0x00”两字节表示;“b”使用“0x62 0x00”两字节表示;“中”使用“0x4e 0x2d”两字节表示。文件开头的“0xff 0xfe”表示“UTF-16 LE”。

3. UCS-2 Big endian/UTF-16 BE

Big endian表示小字节序,数值中权重低的字节放在后面,比如字符“ab中”在TXT文件中的数值如下,其中的“a”使用“0x00 0x61”两字节表示;“b”使用“0x00 0x62”两字节表示;“中”使用“0x2d 0x4e”两字节表示。文件开头的“0xfe 0xff”表示“UTF-16 BE”。

4. UTF8

在上面2种方法中,每一个UNICODE使用2字节来表示,这有3个缺点:表示的字符数量有限、对于ASCII字符有空间浪费、如果文件中有某个字节丢失,这会使得后面所有字符都因为错位而无法显示。使用UTF8可以解决上述所有问题。UTF8是变长的编码方法,有2种UTF8格式的文件:带有头部、不带头部。先举例,看下图:

对于其中的ASCII字符,在UTF8文件中直接用其ASCII码来表示,比如上图中的0x61表示字符a、0x62表示字符b。上图中的3个字节“0xe4 0xb8 0xad”表示的数值是0x4e2d,对应“中”的UNICODE码。

对于非ASCII字符,使用变长的编码:每一个字节的高位都自带长度信息。请看下图:

上图中,0xe4的二进制是“11100100”,高位有3个1,表示从当前字节起有3字节参与表示UNICODE;0xb8的二进制是“10111000”,高位有1个1,表示从当前字节起有1字节参与表示UNICODE;0xad的二进制是“10101101”,高位有1个1,表示从当前字节起有1字节参与表示UNICODE;

除去高位的“1110”、“10”、“10”后,剩下的二进制数组合起来得到“01001110001101”,它就是0x4e2d,即“中”的UNICODE值。使用UTF8编码时,即使TXT文件中丢失了某些数据,也只会影响到当前字符的显示,后面的字符不受影响。

unicode字符显示方框_【硬核】韦东山:字符的编码方式相关推荐

  1. 调链接_硬核科普 | 三根弹簧让你链接宇宙的混响效果器?!

    Solo 吉他音乐作品 首发Solo吉他音乐 "硬核的科普千篇一律 有趣的讲解万里挑一" 十个混响链接宇宙这个是很久以前的一个段子 但是我去听了一下 还真是链接宇宙了....... ...

  2. 切换数据库_硬核数据库postgres使用pgpool完成主备自动切换,快来盘它

    小吴总的鸡汤 postgres作为年度最佳数据库在国内得不到大范围使用真的太可惜了!干巴巴的,麻麻赖赖的,一点都不圆润,怎么办?盘他! 书接上回,为了解决postgres的高可用部署问题,需解决以下几 ...

  3. ppp协议pap验证过程状态转移图_硬核分享|Crust 核心协议栈的设计与实现

    "Crust 实现了去中心化存储的激励层协议,适配包括 IPFS 在内的多种存储层协议,并对应用层提供支持.同时 Crust 的架构也有能力对去中心化计算层提供支持,构建分布式云生态.&qu ...

  4. 网卡vlan标签_硬核来了,VLAN揭秘!!!

    浅谈网络通讯中经常被提及的VLAN 点击蓝注我 蓝字你会发现更多哦 在电力行业中,调度部门会要求在调度数据网使用的交换机.路由器等设备里配置VLAN.配置VLAN不仅可以起到划分业务.防止网络风暴的目 ...

  5. usb连接不上 艾德克斯电源_硬核充电宝?360汽车应急电源入手体验

    [前言] 寒冷的冬季不仅是疾病的高发季节,对电子产品来说也是故障高发期,尤其是依靠电池的设备.大家最能切身体会到的莫过于手机续航时间明显降低,这主要是低温导致化学反应不活跃所造成.汽车同样也会有这个问 ...

  6. aftershokz蓝牙搜不到_硬核!小程序时怎么控制蓝牙设备的?

    文章涉及到大量软硬件知识,没有编程基础的小伙伴看起来会很吃力,硬核预警! hi,大家好,因为个人原因没办法上传视频,所以最近将会以文章的形式进行更新,点赞投币收藏转发还是需要的,谢谢大家. 如果说你们 ...

  7. waves效果器_硬核科普 | 三根弹簧让你链接宇宙的混响效果器?!

    Solo 吉他音乐作品 首发Solo吉他音乐 "硬核的科普千篇一律 有趣的讲解万里挑一" 十个混响链接宇宙这个是很久以前的一个段子 但是我去听了一下 还真是链接宇宙了....... ...

  8. python画圆形螺旋线_硬核教程,利用 Python 搞定精美网络图!

    硬核教程, 利用 Python 搞定精美网络图! 一.NetworkX 概述 NetworkX 是一个用 Python 语言开发的图论与复杂网络建模工具,内置了常用的图与复杂网络分析算法,可以方便的进 ...

  9. python n个list如何组成矩阵_硬核科普系列:用python帮你建立自己的投资组合

    听说金融量化很火,当一众金融大佬还在敲打excel的时候,编程技能树早就点满了的程序员是不是开始疯狂抖腿,跃跃欲试.所以小码想开一个硬核科普系列,和大家一起探索如何用python做投资分析. 今天的话 ...

最新文章

  1. Linux下gdb attach的使用(调试已在运行的进程)
  2. iOS UICollectionView 使用
  3. android training 笔记
  4. 【python】数据结构与算法—双端队列(一)
  5. matlab 腐蚀 结构元素,图像的腐蚀
  6. 公布自己的pods到CocoaPods trunk 及问题记录
  7. JavaScript:判断两个日期之间的差距天数
  8. java treetable_00035-layui+java 树形表格treeTable(异步请求)
  9. FusionSphere 物理CPU与VCPU的关系梳理总结
  10. Eclipse连接SQLServer2008
  11. Pintech品致钳形交直流电流探头的操作步骤是什么
  12. ZQ计分器的隐私条款
  13. 802.11ac 速率 + 信道 + 国家码信道
  14. Python实现文本替换
  15. java语言基础知识点
  16. 关于三大运营商招聘网站
  17. 程序员折腾之路---日常工具集合整理之软件篇
  18. 【读论文】RFN-Nest: An end-to-end residual fusion network for infrared and visible images
  19. android 开发蓝牙电子秤,GitHub - xiangbohua/scales-bridge: scales-bridge 电子称 蓝牙电子秤 连接库...
  20. 12.Isaac教程--未来工厂中的搬运车

热门文章

  1. jvm类加载过程_JVM知识点——深入理解JVM的类加载
  2. 解决fitz模块报错
  3. 修改Kali Linux终端主题
  4. Xamarin XAML语言教程对象元素的声明方式
  5. 从python开始学编程vamei_从python开始学编程-vamei(1)
  6. 山东财经大学python实验六答案_实验六(带答案)
  7. 当机器人遇上神经科学时,将会发生什么?
  8. 利用卷积神经网络对脑电图解码及可视化
  9. seaborn系列 (14) | 条形图barplot()
  10. python list 和矩阵的切片