您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

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

时间:2023-12-08 12:37:58  来源:微信公众号  作者:古时的风筝

平时开发的时候,相信很多人都碰到过乱码的问题,尤其是中文乱码。多年以前,我学 Python/ target=_blank class=infotextkey>Python 的时候碰到的第一个难题就是乱码问题,差点《从入门到放弃了》。

当时就是写一段 Python 的 Hello World 程序,只不过是把 Hello World 换成了中文输出,结果你猜怎么着?乱码了。

后来发现是因为 ASCII 编码和 UTF-8 的问题,Python 默认使用了 ASCII ,而我写的中文并不包含在 ASCII 码范围内,要改成 UTF-8。就是在 Python 文件的开头加入下面这一行。

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

由于当时这个乱码问题印象深刻,以至于多年之后,虽然很长时间不怎么写 Python了,但这一行代码我仍然能够快速的敲出来,并且一个空格都不差。

相信很多同学也有类似的经历,并且在查找解决办法的过程中会碰到 UTF-8、Unicode、GBK、GB2312 等等一堆的代号。之后呢,通过复制粘贴顺利的解决问题。

今天,我们就来理一理 Unicode 和 UTF-8 ,以及其他各种各样的代号之间的关系。

Unicode - 统一码

始皇嬴政“车同轨,书同文,统一度量衡”的目的是什么,就是为了统一标准,就是现在的ISO国际标准啊。

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

Unicode 是一种计算机字符集标准,它就像是一部世界通用的字典,里面包含了几乎所有的文字集合,包括中文、英文、拉丁文、希腊文等等,以及每一种语言中的符号。

阿拉伯数字 「0」的 Unicode 码就是 U+0030,汉字「中」的 Unicode 码就是 U+4E2D,这是固定不变的,符号U+是为了表示这是 Unicode 字符。

你翻开这个字典,找到第0030页,里面就写这阿拉伯数字「0」,翻开第4E2D页,上面就写着汉字「中」。Unicode 码是用十六进制表示的,0030是十六进制的0x0030,4E2D是十六进制的 0x4E2D。

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

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

Unicode 字符映射

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

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

通常我们用到的字符都是在第0号平面的,也叫基本多文种平面,也就是0x0000到0xFFFF这个区间内的。这个区间能表示2的16次方个字符,也就是65536个。拉丁文、常用的东亚文字都在这个区间内。

为什么是65536个呢。一位16进制表示4位2进制,所以4位16进制,正好是二进制的16位,刚好可以表示2的16次方个数字,也就是65536个。

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

16个平面怎么来的呢,就是在4位16进制前面又加了两位,但是只用到了 0x00到0x10这个区间表示平面,16进制的10,刚好是16,从0到16,一共17个平面。

最常用的就是0号平面,但是1、2、3号平面也用到了一些,比如第2号平面就是放的一些罕见的汉字或地区方言用字,比如粤语的字喃。

至于那些未使用的平面,等将来有了类似于emoj这种字符种类越来越多,或者外星人来的时候用吧。

有了 Unicode 为什么还要 UTF-8

UTF-8 应该是开发过程中接触最多的代号了,读写文件、数据库等等都会提到它。

UTF-8 全称是 8-bit Unicode Transformation Format,这就清楚了吧,是用来转编Unicode码的。除了UTF-8外,还有UTF-16、UTF-32 ,以及中国的 GB 18030 等。

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

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

所以,Unicode 只制定标准,不做具体实现,具体的实现方式就要依靠 UTF-8、GB18030 这些了。

拿 UTF-8 来说,它是一种可变长字符编码,用ASCII码能表示的就直接用ASCII码,不行的再想办法,主打一个能省则省。

可以用文本编辑器测试一下,写一个英文字母,用 UTF-8 编码保存,大小是1个字节。而如果写一个汉字呢,就是3个字节。

同样的,UTF-16、UTF-32都有自己的一套编码方式,宗旨就是为了减小体积,提高效率。

为什么就乱码了呢

你可以在记事本中写入一个汉字,然后将编码格式保存为 ANSI 。

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

然后用其他的工具打开(不要用windows的记事本或写字板,它俩会自动识别),我用 Sublime Text 打开,显示的就是乱码。

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

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

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

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

而如果你将 UTF-8 编码的字符,用其他的编码方式进行解码,那大概就没那么顺利了,出来的很可能是乱码。例如下面这个,将UTF-8编码后的E4B8AD 用 TMD-8(瞎说的)进行解码,那出来就是????

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

GB2312、GB18030

此外,我们肯定还听说过 GB2312、GB18030,那它们又是什么呢?

GB18030是GB2312的扩展版本(升级版),现在的标准就是GB18030,GB2312 可以不再使用了。

GB2312和GB18030即是字符集,又同时是编码方式。

以前GB2312是专门为了中文以及少数民族字符设计的,随着不断的扩充,GB18030已经支持 Unicode  字符集了。

总结

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


Tags:Unicode   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
为什么只有Unicode是不够的,UTF-8如何解决编码问题?
UnicodeUnicode是一种字符编码标准,它为世界上几乎所有的文字和符号分配了唯一的数字编码。这使得不同的计算机系统和软件能够正确地显示和处理各种语言的文字。Unicode采用1...【详细内容】
2024-01-04  Search: Unicode  点击:(91)  评论:(0)  加入收藏
你 UTF-8 乱码,关我 Unicode 什么事
平时开发的时候,相信很多人都碰到过乱码的问题,尤其是中文乱码。多年以前,我学 Python 的时候碰到的第一个难题就是乱码问题,差点《从入门到放弃了》。当时就是写一段 Python 的...【详细内容】
2023-12-08  Search: Unicode  点击:(297)  评论:(0)  加入收藏
python打印出八卦和六十四卦的符号和unicode编码
易经中的八卦和六十四卦符号,文档输入时都不是很方便,word或有些拼音输入法都可以把八卦符号当作特殊符号来输入,很少提供六十四卦符号,碰到六十四卦符号就有点麻烦了,甚至不得不...【详细内容】
2023-02-08  Search: Unicode  点击:(288)  评论:(0)  加入收藏
帮你搞清ASCII、Unicode和UTF-8区别,拿走不谢
首先说一下背景:由于计算机是美国人发明的,因此最早只有127个字母被编码到计算机中,也就是大小写英文字母、数字和一些符号,这个编码表称为ASCII编码。例如:大写字母A的编码是65,...【详细内容】
2020-10-13  Search: Unicode  点击:(285)  评论:(0)  加入收藏
5分钟读懂Unicode
Unicode是涵盖世界上大多数书写系统。用在网络,大多数操作系统,Java和.NET的标准编码等。在Unicode诞生之前,都有自己的编码,它们都不同,而且不兼容编码。而Unicode是几乎所有字...【详细内容】
2020-08-26  Search: Unicode  点击:(2255)  评论:(0)  加入收藏
深度详解Python中Unicode编码
Unicode是什么计算机存储的基本单位是 八位字节 ,由 8 个比特位组成,简称 字节 。由于英文只由 26 个字母加若干符号组成,因此英文字符可以直接用 字节 来保存。其他诸如中日韩...【详细内容】
2020-07-29  Search: Unicode  点击:(1090)  评论:(0)  加入收藏
计算机编码ASCII、GBK、Unicode、UTF-8和URL编码的区别
在计算机中,所有的数据在存储和运算时都要使用二进制数值表示(因为计算机用高电平和低电平分别表示1和0),而具体用哪些二进制数字表示哪个符号,当然每个人都可以约定自己的一套(...【详细内容】
2019-09-24  Search: Unicode  点击:(828)  评论:(0)  加入收藏
彻底弄懂UTF-8、Unicode、宽字符、locale
最近使用到了wchar_t类型,所以准备详细探究下,没想到水还挺深,网上的资料大多都是复制粘贴,只有个结论,也没个验证过程。本文记录探究的过程及结论,如有不对请指正。Unicode、UCSU...【详细内容】
2019-07-09  Search: Unicode  点击:(1455)  评论:(0)  加入收藏
UTF-8 和 Unicode 的区别
utf-8和Unicode到底有什么区别?是存储方式不同?编码方式不同?它们看起来似乎很相似,但是实际上他们并不是同一个层次的概念...【详细内容】
2019-04-17  Search: Unicode  点击:(2364)  评论:(0)  加入收藏
▌简易百科推荐
即将过时的 5 种软件开发技能!
作者 | Eran Yahav编译 | 言征出品 | 51CTO技术栈(微信号:blog51cto) 时至今日,AI编码工具已经进化到足够强大了吗?这未必好回答,但从2023 年 Stack Overflow 上的调查数据来看,44%...【详细内容】
2024-04-03    51CTO  Tags:软件开发   点击:(5)  评论:(0)  加入收藏
跳转链接代码怎么写?
在网页开发中,跳转链接是一项常见的功能。然而,对于非技术人员来说,编写跳转链接代码可能会显得有些困难。不用担心!我们可以借助外链平台来简化操作,即使没有编程经验,也能轻松实...【详细内容】
2024-03-27  蓝色天纪    Tags:跳转链接   点击:(12)  评论:(0)  加入收藏
中台亡了,问题到底出在哪里?
曾几何时,中台一度被当做“变革灵药”,嫁接在“前台作战单元”和“后台资源部门”之间,实现企业各业务线的“打通”和全域业务能力集成,提高开发和服务效率。但在中台如火如荼之...【详细内容】
2024-03-27  dbaplus社群    Tags:中台   点击:(8)  评论:(0)  加入收藏
员工写了个比删库更可怕的Bug!
想必大家都听说过删库跑路吧,我之前一直把它当一个段子来看。可万万没想到,就在昨天,我们公司的某位员工,竟然写了一个比删库更可怕的 Bug!给大家分享一下(不是公开处刑),希望朋友们...【详细内容】
2024-03-26  dbaplus社群    Tags:Bug   点击:(5)  评论:(0)  加入收藏
我们一起聊聊什么是正向代理和反向代理
从字面意思上看,代理就是代替处理的意思,一个对象有能力代替另一个对象处理某一件事。代理,这个词在我们的日常生活中也不陌生,比如在购物、旅游等场景中,我们经常会委托别人代替...【详细内容】
2024-03-26  萤火架构  微信公众号  Tags:正向代理   点击:(10)  评论:(0)  加入收藏
看一遍就理解:IO模型详解
前言大家好,我是程序员田螺。今天我们一起来学习IO模型。在本文开始前呢,先问问大家几个问题哈~什么是IO呢?什么是阻塞非阻塞IO?什么是同步异步IO?什么是IO多路复用?select/epoll...【详细内容】
2024-03-26  捡田螺的小男孩  微信公众号  Tags:IO模型   点击:(8)  评论:(0)  加入收藏
为什么都说 HashMap 是线程不安全的?
做Java开发的人,应该都用过 HashMap 这种集合。今天就和大家来聊聊,为什么 HashMap 是线程不安全的。1.HashMap 数据结构简单来说,HashMap 基于哈希表实现。它使用键的哈希码来...【详细内容】
2024-03-22  Java技术指北  微信公众号  Tags:HashMap   点击:(11)  评论:(0)  加入收藏
如何从头开始编写LoRA代码,这有一份教程
选自 lightning.ai作者:Sebastian Raschka机器之心编译编辑:陈萍作者表示:在各种有效的 LLM 微调方法中,LoRA 仍然是他的首选。LoRA(Low-Rank Adaptation)作为一种用于微调 LLM(大...【详细内容】
2024-03-21  机器之心Pro    Tags:LoRA   点击:(12)  评论:(0)  加入收藏
这样搭建日志中心,传统的ELK就扔了吧!
最近客户有个新需求,就是想查看网站的访问情况。由于网站没有做google的统计和百度的统计,所以访问情况,只能通过日志查看,通过脚本的形式给客户导出也不太实际,给客户写个简单的...【详细内容】
2024-03-20  dbaplus社群    Tags:日志   点击:(4)  评论:(0)  加入收藏
Kubernetes 究竟有没有 LTS?
从一个有趣的问题引出很多人都在关注的 Kubernetes LTS 的问题。有趣的问题2019 年,一个名为 apiserver LoopbackClient Server cert expired after 1 year[1] 的 issue 中提...【详细内容】
2024-03-15  云原生散修  微信公众号  Tags:Kubernetes   点击:(5)  评论:(0)  加入收藏
站内最新
站内热门
站内头条