前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >代码的注释又变成“锟斤拷”了?都是字符集惹的祸!

代码的注释又变成“锟斤拷”了?都是字符集惹的祸!

作者头像
程序员牛肉
发布2024-09-26 13:03:55
890
发布2024-09-26 13:03:55
举报
文章被收录于专栏:小牛肉带你学Java

大家好,我是程序员牛肉。

相信各位在各种编译器中写代码的时候,一定会遇到一个问题:

明明代码在同学的电脑里是好的,在我的电脑里怎么注释就全部乱码了?

要想解释这种情况,还需要我们从”字符集“这个概念讲起:

人类世界有海量的文字,这些文字可以被刻在石头上,墙壁上,竹筒上。这一个个符号都是字符。而我们把字符组成的集合就叫做字符集。

但很遗憾的是:计算机并不能读懂这些字符。计算机是0和1的世界,我们该如何将这些字符存储到计算机中成为一个难题

因此我们想出了一个办法:用一个特定的二进制数字代表一个特定的字符。这样就实现了字符在计算机中的表示,字符集编码应运而生。

ASCLL码:

ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是最早的字符集编码方案之一,它定义了一组128个字符及其对应的7位二进制编码。ASCII字符集包含了英文字母(大写和小写)、数字、标点符号、控制字符(例如换行符、回车符)和一些特殊符号(例如美元符号、百分号等)。

ASCII表展示:

众所周知计算机存储数据的基本单位是字节,而一个字节由八个二进制位组成,也就是八个比特(bit),每个比特有0 和 1 两种状态,因此一个字节一共有 256 种不同的二进制状态,也就是最多可以存储256个不同的字符。

而随着各国都逐渐进入信息化时代,这128个字符显然不够用了,一个字节有256种状态,而初代的ASCII码只占用了128种状态,因此西欧的国家联合起来,搞了EASCII码。

EASCLL码:

EASCII(Extended AS而CII)概念涌现于计算机发展的早期,旨在为ASCII字符集增加更多的字符和符号,超出了原始的128个字符。EASCII对ASCII字符集进行了自定义的扩展,使它能够适应更多的国际字符需求和特殊用途。

扩展字符通常包括特殊符号、非拉丁字符、货币符号、辅助标点符号以及其他语言的字母、符号和标点符号等。扩展ASCII字符集的具体范围和定义不是标准化的,因此可能会因不同的计算机系统和编码方案而有所不同。

而正如我们前面说到的:扩展ASCII字符集的具体范围和定义不是标准化的,因此可能会因不同的计算机系统和编码方案而有所不同。

此时各国都制定了自己的扩展ASCII字符集,都有自己独特的后128位表示,一共搞出了两百多种扩展ASCII表,此时字符集编码迎来了一个混乱的纪元:一个二进制数字在不同的字符集编码中对应的字符也不同,哪怕是同一份文本,放到不同的计算机中打开,显示的内容也可能不同。

这种混乱的纪元一直持续到 中日韩 进入信息化时代迎来爆发。

原因很简单:这三个国家的字实在是太多了,一个字节的256种状态已经无法满足人们的正常需求了

我们以中国做简单的例子讲解:

1980年中国统计的常用汉字为6763个汉字,因此我们推出了我们自己的字符集:

GB2312-80

GB2312-80是中华人民共和国国家标准GB 2312-1980的简称。它是一种汉字字符集编码方式,由6763个常用汉字和682个非汉字符号组成,共计7445个字符。GB2312-80取代了GB2312-80之前使用的GB2312-80编码,成为计算机上最常用的中文字符集之一。它以双字节编码形式表示汉字,每个汉字由一个区号和一个位号组成。GB2312-80的字符编码范围被广泛应用于计算机系统、操作系统、数据库、通信协议等领域,为中文信息处理提供了基础支持。

正是因为我们的汉字字符集太多,因此使用了两个字节的空间,这也就是为什么中文的","要比英文的”,“看起来更加宽的原因。

GB2312-80截选展示:

而此时虽然我们有了自己的字符集,但是仍然会遇到一些生僻字没有被收录的情况,因此会出现一些地区上户口的时候,因为名字中含有生僻字所以电脑识别不了而被迫改名。

而随着中日韩三国对于字符集编码的疯狂扩展,微软也开始重视起来了这个问题。最终推出了:

GB2312

而我们国家对此再做了优化,补充了一些繁体字后,推出了汉字内码扩展规范:GBK

GBK(Guojia Biaozhun Kuozhan,国家标准扩展)是在GB2312的基础上进行扩展而来的字符集编码方案。GBK于1995年发布,使用双字节编码,但扩展了GB2312中未包含的很多生僻字和繁体字,以及包括繁体字在内的其他语种的字符。

因此,可以说GBK是GB2312的一个扩展版本,它在GB2312的基础上增加了更多的字符,使得可以更好地满足多种语言的需求。

需要注意的是,尽管GB2312和GBK都是被广泛用于简体中文编码的字符集,但它们并不兼容于Unicode或UTF-8等国际化的字符集编码方案。为了更好地支持多语言和国际化,后来出现了更先进的字符集编码方案,如GB18030。

而进行到这里,海量的字符集编码为人类计算机交流带来的麻烦,已经让人叫苦不得,因此建立一个统一的字符集编码变成了众望所归。

🌍UNICODE(万国码)

UNICODE(万国码)是一种用于表示世界上几乎所有字符的字符集编码方案。它的目标是为所有的书写系统和符号提供一个统一的编码标准,以便在计算机系统中进行交换、存储和处理。

它的优势在于统一了字符的编码方案,使得不同语言、不同符号可以在同一个系统上相互兼容。UNICODE使用了32位的编码空间,可以表示超过100万个不同的字符。

最常见的UNICODE编码方案是UTF-8(Unicode Transformation Format 8-bit),它是一种可变长度的编码方式,可以使用1至4个字节来表示不同的字符。UTF-8通过自适应字节序列来支持各种语言和字符,因此在互联网和计算机系统中得到广泛应用。

除了UTF-8,还有其他的UNICODE编码方案,如UTF-16和UTF-32,它们使用固定长度的编码方式,分别使用16位和32位来表示字符。这些编码方案主要用于特定领域或特殊需求中。

万国码节选图片:

而万国码的收录方式也埋下了一个很大的坑,甚至到现在还在被别有用心的人利用的案例。但在这里我们同学做介绍,感兴趣的人可以自行了解。

而现在有的软件还在默认使用GBK编码,当我们尝试用这个软件打开一个使用UNICODE编码的字符集的时候,自然就会出现乱码。

而字符集发展到UNICODE阶段,基本上痛点问题已经被解决,而随着越来越多的软件适配UNICODE,我们的字符乱码事件也会越来越少。

回到我们开头遇到的那个问题:

为什么同一份代码在同学的电脑上可以正确显示,但是到自己的电脑上就是乱码?

答案已经呼之欲出,就是因为两个电脑在解析代码的时候,使用的字符集不一样。

相信你已经了解了”字符集“背后的故事,希望我的文章可以帮到你。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-07-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员牛肉 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档