ASCII 常见的计算机字符编码特征 UTF8 中文字符编码科普教程

ximagine
ximagine
ximagine
2023年7月28日21:20:2211
0
 0 3048字阅读10分9秒沉浸阅读
宝藏摘要

编码是信息从一种形式或格式转换为另一种形式的过程,解码则是编码的逆过程,计算机中的字符之所以需要经过编码,归根结底是因为计算机中的所有数据只能用二进制表示,即 0 和 1 两种数值,想要在计算机系统中对我们所认知的字符加以区分,就需要使用 0 和 1 的排列来为其编码,通常所说的 Unicode 是给全世界所有语言的所有文字或字母一个独一无二的数字编码,荒岛本次带来计算机字符编码科普教程。

荒岛广告位 火热招商中 详情请咨询 荒岛客服号 Q10907252
ASCII 常见的计算机字符编码特征  UTF8 中文字符编码科普教程
宝藏归属:荒岛  百科 发表观点:前往评论 浏览次数:11 次 更新时间:2023年7月28日 21:21:38

编码是信息从一种形式或格式转换为另一种形式的过程,解码则是编码的逆过程,计算机中的字符之所以需要经过编码,归根结底是因为计算机中的所有数据只能用二进制表示,即 0 和 1 两种数值,想要在计算机系统中对我们所认知的字符加以区分,就需要使用 0 和 1 的排列来为其编码,通常所说的 Unicode 是给全世界所有语言的所有文字或字母一个独一无二的数字编码,荒岛本次带来计算机字符编码科普教程宝藏来自荒岛 - 一座藏有宝藏的小岛-https://x-imagine.com/ascii-utf8-coding.html

ASCII 编码

American Standard Code for Information Interchange 美国信息交换标准代码,这是最通用的信息交换标准,ASCII 编码每个字母或符号占 1byte(8bits),并且 8bits 的最高位是 0,因此 ASCII 能编码的字母和符号只有 128 个。有一些编码把 8bits 最高位为 1 的后 128 个值也编码上,使得 1byte 可以表示 256 个值,但是这属于扩展的 ASCII,并非标准 ASCII,通常所说的标准 ASCII 只有前 128 个值,ASCII 编码几乎被世界上所有编码所兼容(UTF16 和 UTF32 是个例外),因此如果一个文本文档里面的内容全都由 ASCII 里面的字母或符号构成,那么不管你如何展示该文档的内容都不可能出现乱码的情况。宝藏来自荒岛 - 一座藏有宝藏的小岛-https://x-imagine.com/ascii-utf8-coding.html

ASCII 有其局限性,只能显示 26 个基本拉丁字母、阿拉伯数字和英式标点符号,对于其它同属印欧语系的语言来说,还有部分字符无法使用 ASCII 编码,怎么解决这个问题?我们之前提到过,ASCII 仅使用一个字节中的 7 个比特位,还剩下一个比特位没有使用,通过排列知识我们可以算出,2^8 = 256,如果使用 8 个比特位,那我们将可以对 256 个字符进行编码,排除掉 ASCII 中原有的 128 个字符,还多出来 128 个空位,这已经完全足够其它印欧语系的语言使用了。宝藏来自荒岛 - 一座藏有宝藏的小岛-https://x-imagine.com/ascii-utf8-coding.html

GBK 编码

GB 全称 GuoBiao 国标,GBK 全称 GuoBiaoKuozhan 国标扩展。GB18030 编码兼容 GBK,GBK 兼容 GB2312,其实这三种编码有着非常深厚的渊源。GB2312 最早一版的中文编码,每个字占据 2bytes。由于要和 ASCII 兼容,那这 2bytes 最高位不可以为 0 了(否则和 ASCII 会有冲突)。在 GB2312 中收录了 6763 个汉字以及 682 个特殊符号,已经囊括了生活中最常用的所有汉字。GB2312 编码表有个值得注意的点,这个表中也有一些数字和字母,与 ASCII 里面的字母非常像。例如 A3B2 对应的是数字 2(如下图),但是 ASCII 里面 50(十进制)对应的也是数字 2。他们的区别就是输入法中所说的“半角”和“全角”,全角的数字 2 占两个字节。通常,我们在打字或编程中都使用半角,即 ASCII 来编写数字或英文字母,如果写全角的数字或字母,编译器很有可能不认识。宝藏来自荒岛 - 一座藏有宝藏的小岛-https://x-imagine.com/ascii-utf8-coding.html

由于 GB2312 只有 6763 个汉字,于是 GBK 中在保证不和 GB2312、ASCII 冲突(即兼容 GB2312 和 ASCII)的前提下,也用每个字占据 2bytes 的方式又编码了许多汉字。经过 GBK 编码后,可以表示的汉字达到了 20902 个,另有 984 个汉语标点符号部首,值得注意的是这 20902 个汉字还包含了繁体字,但是该繁体字与台湾 Big5 编码不兼容,同一个繁体字很可能在 GBK 和 Big5 中数字编码是不一样的。宝藏来自荒岛 - 一座藏有宝藏的小岛-https://x-imagine.com/ascii-utf8-coding.html

GB18030 多出来的汉字使用 4bytes 编码。为了兼容 GBK 这个四字节的前两位显然不能与 GBK 冲突(实操中发现后两位也并没有和 GBK 冲突)。我国在 2000 年和 2005 年分别颁布的两次 GB18030 编码,其中 2005 年的是在 2000 年基础上进一步补充。至此,GB18030 编码的中文文件已经有七万多个汉字了,甚至包含了少数民族文字。GB2312,GBK,GB18030 都是采取了固定长度的办法来解决字符分隔问题。GBK 和 GB2312 比 ASCII 多出来的字都是 2bytes,GB18030 比 GBK 多出来的字都是 4bytes。ASCII 编码由于是单字节,所以没有第 2 位。因为 GBK 兼容 GB2312,所以理论上 GB2312 的领土面积也可以算在 GBK 的范围内,GB18030 也同理。GB18030 由于是 4bytes 编码,只是展示了前 2bytes 的值域,虽然面积最小,但是如果后 2bytes 也算上,GB18030 新编码的字数实际上远远多于 GBK。可以看出为了做到兼容性,以上所有编码的前 2bytes 做到了相互值域不冲突,这样就可以允许几种不同编码中的文字同时出现在同一个文本文件中。只要全都按照 GB18030 编码的规则去解析并展示文件,就不会有乱码出现。宝藏来自荒岛 - 一座藏有宝藏的小岛-https://x-imagine.com/ascii-utf8-coding.html

UTF8 编码
宝藏来自荒岛 - 一座藏有宝藏的小岛-https://x-imagine.com/ascii-utf8-coding.html

UTF-8 就是 Unicode 的一种具体实现,原本的 Unicode 编码占用了两个字节的长度,但在 UTF-8 编码中存储时却用到了 3 个字节,UTF-8 采用了可变长度字符编码存储方式,单字节字符,字节第一位设为 0,与 ASCII 编码完全保持一致,多字节字符,假设字符会占用 n 个字节,需要将第一个字节的前 n 位设为 1,紧接着的一位设为 0,其余字节前两位皆要设为 10,而后所有字节剩下的空位用来依次存放字符的 Unicode 编码,高位用 0 补足。UTF8 可以表示出世界上所有的文字,UTF8 与前面说的 GB 系列编码不兼容,所以如果一个文件中即有 UTF8 编码的文字,又有 GB18030 编码的文字那绝对会有乱码。宝藏来自荒岛 - 一座藏有宝藏的小岛-https://x-imagine.com/ascii-utf8-coding.html

Unicode 赋予了全世界所有文字和符号一个独一无二的数字编号,UTF8 所做的事情就是把这个数字编号表示出来,UTF8 解决字符间分隔的方式是数二进制中最高位连续 1 的个数来决定这个字是几字节编码。0 开头的属于单字节,和 ASCII 码重合做到了兼容。Unicode 的数值和每个字的字节数融合在一起,最坏情况是 6 个字节表示一个字,已经足够表示世界上所有语言的所有文字了。不过从这种表示方式也可以很显然地看出来,UTF8 和 GBK 没有任何关系除了都兼容 ASCII 以外。对于中文汉字来说所有常用汉字的 Unicode 值都可以用 3 字节的 UTF8 表示出来,而 GBK 编码的汉字基本是 2 字节,如果把 GBK 编码的中文文本另存为 UTF8 编码,体积会大 50%左右,这也是 UTF8 的一点小瑕疵,存储同样的汉字体积比 GBK 要大 50%。宝藏来自荒岛 - 一座藏有宝藏的小岛-https://x-imagine.com/ascii-utf8-coding.html

ANSI 编码

准确说并不存在哪种具体的编码方式叫做 ANSI,它只是一个 Windows 操作系统上的别称而已,在中文简体 Windows 操作系统上 ANSI 就是 GBK;在泰语操作系统上 ANSI 就是 TIS-620 一种泰语编码;在韩语操作系统上 ANSI 就是 EUC-KR 一种韩语编码,并且所谓的 ANSI 只存在于 Windows 操作系统上。宝藏来自荒岛 - 一座藏有宝藏的小岛-https://x-imagine.com/ascii-utf8-coding.html

Latin1 编码

Latin1 编码又名 ISO-8859-1 编码,是 Mysql 数据库表的默认编码方式,也是单字节编码方式,也就是说最多只能表示 256 个字母或符号,并且前 128 个和 ASCII 完全吻合。Latin1 在 ASCII 基础上又充分利用了后面那 128 个值,赋予他们一些泰语、希腊语等字母或符号,将 1 个字节的 256 个值全部占满了,单字节编码作为默认值肯定是比多字节做默认值更不容易在插入数据时报错。既然 Latin1 为单字节编码,并且将 1 个字节的所有 256 个值全部占满,因此理论上把任何编码的值塞到 Latin1 字段都是可以存的,用 Latin1 存任何文字技术上都可以但是经常会导致数据显示乱码。宝藏来自荒岛 - 一座藏有宝藏的小岛-https://x-imagine.com/ascii-utf8-coding.html

请按 Ctrl+D 收藏荒岛分享给好友 如您发现本文件已经失效无法下载请联系站长修正
  • 荒岛公众号
  • 扫一扫关注
  • weinxin
  • 荒岛小程序
  • 扫一扫关注
  • weinxin
荒岛广告位 火热招商中 详情请咨询 荒岛客服号 Q10907252
宝藏归属:荒岛 百科  荒岛一座藏有宝藏的小岛
荒岛广告位 火热招商中 详情请咨询 荒岛客服号 Q10907252

发表评论