当前位置:首页 > 科技  > 软件

你 UTF-8 乱码,关我 Unicode 什么事

来源: 责编: 时间:2023-12-08 09:14:09 153观看
导读平时开发的时候,相信很多人都碰到过乱码的问题,尤其是中文乱码。多年以前,我学 Python 的时候碰到的第一个难题就是乱码问题,差点《从入门到放弃了》。当时就是写一段 Python 的 Hello World 程序,只不过是把 Hello World

平时开发的时候,相信很多人都碰到过乱码的问题,尤其是中文乱码。多年以前,我学 Python 的时候碰到的第一个难题就是乱码问题,差点《从入门到放弃了》。2EJ28资讯网——每日最新资讯28at.com

当时就是写一段 Python 的 Hello World 程序,只不过是把 Hello World 换成了中文输出,结果你猜怎么着?乱码了。2EJ28资讯网——每日最新资讯28at.com

后来发现是因为 ASCII 编码和 UTF-8 的问题,Python 默认使用了 ASCII ,而我写的中文并不包含在 ASCII 码范围内,要改成 UTF-8。就是在 Python 文件的开头加入下面这一行。2EJ28资讯网——每日最新资讯28at.com

# -*- coding:utf-8 -*-

由于当时这个乱码问题印象深刻,以至于多年之后,虽然很长时间不怎么写 Python了,但这一行代码我仍然能够快速的敲出来,并且一个空格都不差。2EJ28资讯网——每日最新资讯28at.com

相信很多同学也有类似的经历,并且在查找解决办法的过程中会碰到 UTF-8、Unicode、GBK、GB2312 等等一堆的代号。之后呢,通过复制粘贴顺利的解决问题。2EJ28资讯网——每日最新资讯28at.com

今天,我们就来理一理 Unicode 和 UTF-8 ,以及其他各种各样的代号之间的关系。2EJ28资讯网——每日最新资讯28at.com

Unicode - 统一码

始皇嬴政“车同轨,书同文,统一度量衡”的目的是什么,就是为了统一标准,就是现在的ISO国际标准啊。2EJ28资讯网——每日最新资讯28at.com

Unicode 真正做到了“书同文”的计算机语言标准,所以 Unicode 也叫统一码、万国码。Unicode 也是在不断更新的,过一段时间就要把新形成的文字加进去,比如 emoj 字符([爱心][庆祝])。就算有一天外星人来了,也得把外星人的文字加进去。到时候可能就得改名字叫太阳系码、宇宙码了。2EJ28资讯网——每日最新资讯28at.com

Unicode 是一种计算机字符集标准,它就像是一部世界通用的字典,里面包含了几乎所有的文字集合,包括中文、英文、拉丁文、希腊文等等,以及每一种语言中的符号。2EJ28资讯网——每日最新资讯28at.com

阿拉伯数字 「0」的 Unicode 码就是 U+0030,汉字「中」的 Unicode 码就是 U+4E2D,这是固定不变的,符号U+是为了表示这是 Unicode 字符。2EJ28资讯网——每日最新资讯28at.com

你翻开这个字典,找到第0030页,里面就写这阿拉伯数字「0」,翻开第4E2D页,上面就写着汉字「中」。Unicode 码是用十六进制表示的,0030是十六进制的0x0030,4E2D是十六进制的 0x4E2D。2EJ28资讯网——每日最新资讯28at.com

下面这幅图,假设右上角有一盏灯,照着上层深颜色的 Unicode 码,透过Unicode码,投影出来的就是对应的具体字符。(比如做一个旁白,没有美术功底,效果做的不太行)。2EJ28资讯网——每日最新资讯28at.com

图片图片2EJ28资讯网——每日最新资讯28at.com

Unicode 字符映射

Unicode 其实就是用十六进制的 0x0000到0x10FFFF 这个范围内的数字表示的。实际上,是根本用不到这么多的。看下面这个表格,Unicode 被分为17个 Plane(平面),每个平面都有自己的功能,并且大多数平面都是不使用或者很少使用的。2EJ28资讯网——每日最新资讯28at.com

图片图片2EJ28资讯网——每日最新资讯28at.com

通常我们用到的字符都是在第0号平面的,也叫基本多文种平面,也就是0x0000到0xFFFF这个区间内的。这个区间能表示2的16次方个字符,也就是65536个。拉丁文、常用的东亚文字都在这个区间内。2EJ28资讯网——每日最新资讯28at.com

为什么是65536个呢。一位16进制表示4位2进制,所以4位16进制,正好是二进制的16位,刚好可以表示2的16次方个数字,也就是65536个。2EJ28资讯网——每日最新资讯28at.com

图片图片2EJ28资讯网——每日最新资讯28at.com

16个平面怎么来的呢,就是在4位16进制前面又加了两位,但是只用到了 0x00到0x10这个区间表示平面,16进制的10,刚好是16,从0到16,一共17个平面。2EJ28资讯网——每日最新资讯28at.com

最常用的就是0号平面,但是1、2、3号平面也用到了一些,比如第2号平面就是放的一些罕见的汉字或地区方言用字,比如粤语的字喃。2EJ28资讯网——每日最新资讯28at.com

至于那些未使用的平面,等将来有了类似于emoj这种字符种类越来越多,或者外星人来的时候用吧。2EJ28资讯网——每日最新资讯28at.com

有了 Unicode 为什么还要 UTF-8

UTF-8 应该是开发过程中接触最多的代号了,读写文件、数据库等等都会提到它。2EJ28资讯网——每日最新资讯28at.com

UTF-8 全称是 8-bit Unicode Transformation Format,这就清楚了吧,是用来转编Unicode码的。除了UTF-8外,还有UTF-16、UTF-32 ,以及中国的 GB 18030 等。2EJ28资讯网——每日最新资讯28at.com

图片图片2EJ28资讯网——每日最新资讯28at.com

既然 Unicode 已经包含了所有字符,为什么还要用 UTF-8进行转编呢,直接用 Unicode 码不就好了吗?原因就是如果用 Unicode 会浪费过多的空间,比如 ASCII 码用256位就能全部覆盖了,但是如果用 Unicode 呢,会多出好多空间来。不便于存储以及传输。2EJ28资讯网——每日最新资讯28at.com

所以,Unicode 只制定标准,不做具体实现,具体的实现方式就要依靠 UTF-8、GB18030 这些了。2EJ28资讯网——每日最新资讯28at.com

拿 UTF-8 来说,它是一种可变长字符编码,用ASCII码能表示的就直接用ASCII码,不行的再想办法,主打一个能省则省。2EJ28资讯网——每日最新资讯28at.com

可以用文本编辑器测试一下,写一个英文字母,用 UTF-8 编码保存,大小是1个字节。而如果写一个汉字呢,就是3个字节。2EJ28资讯网——每日最新资讯28at.com

同样的,UTF-16、UTF-32都有自己的一套编码方式,宗旨就是为了减小体积,提高效率。2EJ28资讯网——每日最新资讯28at.com

为什么就乱码了呢

你可以在记事本中写入一个汉字,然后将编码格式保存为 ANSI 。2EJ28资讯网——每日最新资讯28at.com

图片图片2EJ28资讯网——每日最新资讯28at.com

然后用其他的工具打开(不要用windows的记事本或写字板,它俩会自动识别),我用 Sublime Text 打开,显示的就是乱码。2EJ28资讯网——每日最新资讯28at.com

图片图片2EJ28资讯网——每日最新资讯28at.com

这是因为将中文用 ASCII 编码了,而ASCII字符集中根本不存在中文字符,存的什么东西也不知道。当其他工具用 UTF-8 编码准备展示的时候,发现这存的什么东西,它根本不认识啊。最终显示出来的只能是乱码。2EJ28资讯网——每日最新资讯28at.com

如下图所示,分别用 GB18030 和 UTF-8 对Unicode进行编码,无论你最后是在浏览器还是其他的应用程序内,只要支持对应的编码,都可以正确的解析出对应的字符。2EJ28资讯网——每日最新资讯28at.com

图片图片2EJ28资讯网——每日最新资讯28at.com

而如果你将 UTF-8 编码的字符,用其他的编码方式进行解码,那大概就没那么顺利了,出来的很可能是乱码。例如下面这个,将UTF-8编码后的E4B8AD 用 TMD-8(瞎说的)进行解码,那出来就是????2EJ28资讯网——每日最新资讯28at.com

图片图片2EJ28资讯网——每日最新资讯28at.com

GB2312、GB18030

此外,我们肯定还听说过 GB2312、GB18030,那它们又是什么呢?2EJ28资讯网——每日最新资讯28at.com

GB18030是GB2312的扩展版本(升级版),现在的标准就是GB18030,GB2312 可以不再使用了。2EJ28资讯网——每日最新资讯28at.com

GB2312和GB18030即是字符集,又同时是编码方式。2EJ28资讯网——每日最新资讯28at.com

以前GB2312是专门为了中文以及少数民族字符设计的,随着不断的扩充,GB18030已经支持 Unicode  字符集了。2EJ28资讯网——每日最新资讯28at.com

总结

  • Unicode 是字符集,不是编码方式,只是一个标准。
  • 而 UTF-8、UTF-16 是专门针对于 Unicode 的编码方式,用于存储和传输。
  • 对于纯中文的场景,也可以用GB18030。
  • 如果没有特殊要求,最好还是用 UTF-8 编码,放之四海而皆准,没坏处。

本文链接:http://www.28at.com/showinfo-26-39504-0.html你 UTF-8 乱码,关我 Unicode 什么事

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 刷了360多道算法题,我终于顿悟了它的真谛

下一篇: Java 21 的虚拟线程:高性能并发应用的福音

标签:
  • 热门焦点
  • 5月iOS设备性能榜:M1 M2依旧是榜单前五

    5月iOS设备性能榜:M1 M2依旧是榜单前五

    和上个月一样,没有新品发布的iOS设备性能榜的上榜设备并没有什么更替,仅仅只有跑分变化而产生的排名变动,刚刚开始的苹果WWDC2023,推出的产品也依旧是新款Mac Pro、新款Mac Stu
  • 从 Pulsar Client 的原理到它的监控面板

    从 Pulsar Client 的原理到它的监控面板

    背景前段时间业务团队偶尔会碰到一些 Pulsar 使用的问题,比如消息阻塞不消费了、生产者消息发送缓慢等各种问题。虽然我们有个监控页面可以根据 topic 维度查看他的发送状态,
  • 三分钟白话RocketMQ系列—— 如何发送消息

    三分钟白话RocketMQ系列—— 如何发送消息

    我们知道RocketMQ主要分为消息 生产、存储(消息堆积)、消费 三大块领域。那接下来,我们白话一下,RocketMQ是如何发送消息的,揭秘消息生产全过程。注意,如果白话中不小心提到相关代
  • Python异步IO编程的进程/线程通信实现

    Python异步IO编程的进程/线程通信实现

    这篇文章再讲3种方式,同时讲4中进程间通信的方式一、 Python 中线程间通信的实现方式共享变量共享变量是多个线程可以共同访问的变量。在Python中,可以使用threading模块中的L
  • 得物宠物生意「狂飙」,发力“它经济”

    得物宠物生意「狂飙」,发力“它经济”

    作者|花花小萌主近日,得物宣布正式上线宠物鉴别,通过得物App内的“在线鉴别”,可找到鉴别宠物的选项。通过上传自家宠物的部位细节,就能收获拥有专业资质认证的得物鉴
  • 冯提莫签约抖音公会 前“斗鱼一姐”消失在直播间

    冯提莫签约抖音公会 前“斗鱼一姐”消失在直播间

    来源:直播观察提起“冯提莫”这个名字,很多网友或许听过,但应该不记得她是哪位主播了。其实,作为曾经的“斗鱼一姐”,冯提莫在游戏直播的年代影响力不输于现
  • 华为Mate60标准版细节曝光:经典星环相机模组回归

    华为Mate60标准版细节曝光:经典星环相机模组回归

    这段时间以来,关于华为新旗舰的爆料日渐密集。据此前多方爆料,今年华为将开始恢复一年双旗舰战略,除上半年推出的P60系列外,往年下半年的Mate系列也将
  • 三星显示已开始为AR设备研发硅基LED微显示屏

    三星显示已开始为AR设备研发硅基LED微显示屏

    7月18日消息,据外媒报道,随着苹果首款头显产品Vision Pro在6月份正式推出,AR/VR/MR等头显产品也就将成为各大公司下一个重要的竞争领域,对显示屏这一关
  • 联想小新Pad Pro 12.6将要推出,搭载高通骁龙 870 处理器

    联想小新Pad Pro 12.6将要推出,搭载高通骁龙 870 处理器

    联想小新Pad Pro 12.6将于秋季新品会上推出,官方按照惯例直接在发布会前给出了机型的所有参数。联想小新 Pad Pro 12.6 将搭载高通骁龙 870 处理器,重量为 5
Top