计算机中的文字编码

    xiaoxiao2021-12-14  24

    计算机的编码

    计算机中,储存数据的实际形式是”010101”这样的代码。那像这样只由0和1组成的数据,如何转化为有意义的代码呢?答案便是为这些数据编码。 n位二进制数可以组合成2的n次方个不同的信息,给每个信息规定一个具体码组,这个过程便叫做编码。


    文字编码一直是一个很让人头疼的问题,因为文字的形式多样化,有西方的字母文字,有中国,日本,韩国的表意文字。不同的文字又有许多不同的标准。

    像美标(ASCII)用八位数的二进制(1个字节),从0~127来代表信息的规范编码。但1个字节能表示0~255,于是剩下另外的128个数码就没有规范。于是各个地方的用法不一,最终可能导致一个程序或文本的移植性差。

    又比方说中文:

    有国标(中华人民共和国国家标准信息交换用汉字编码): 国标表(基本表)把七千余汉字、以及标点符号、外文字母等,排成一个94行、94列的方阵。方阵中的一个二维坐标对应一个字符,称为该字的“区位码”。 例如“中”字在方阵中处于第54区第48位,它的区位码就是5448。94是ASCII中形象码(ASCII中的33~126)的总数,国标的本意表示用两个ASCII形象符表示一个汉字, 这样一来,新的问题产生了。在实际使用的时候,需要中英混合,那时,如何才能让机器区分这个字符到底表示的是英文字母还是一个汉字?于是,便将表示汉字的行数字和列数字分表加上128,加到ASCII之外的范围,这样,便不会让机器产生歧义。因此,国标又分纯国标(有歧义),和加上128的准国标。 除了国标外,中文编码还有GBK系列,BIG5(繁体),HZ等编码类型,可以说是类型繁多。

    单单是一个汉语,就有如此多的编码类型,如果想在电脑上显示所有的语言,那电脑得拥有多少编码类型!而且,各个类型会不会产生冲突呢? 答案当然是肯定的。 例如:新建txt文件,将 联通 二字输入到文本中,保存后再打开,你会发现,文中的 联通 消失了,取而代之的一些乱码。

    打开一个文本要确定它的编码格式有三种途径: 第一:检测文本开头字节(最理想的方法) 第二:猜测,通过读取几个字符测试出可能的编码类型(防止未加格式头) 第三:提示,当打开一个不确定编码类型的文本时可以弹出对话框,让用户来选择(如word) 其实软件开发中可能三种方法都会用到 但windows文本编辑器所用的是第二种:所以,用户输入的字符过短的话,或多或少会有一些问题。 先看“联通”的内码(GBK):0xC1AACDA8 C1- 1100 0001 AA- 1010 1010 CD- 1100 1101 A8- 1010 1000 其中一二字节和三四字节中开头都是“110”和“10”,正好与UTF8规则里的双字节模板一致,所以就猜成按UTF-8编码方式打开了 所以只要出现类似“110”和“10”的字符编码,且以ANSI存储,自动打开都会出现乱码的情况,如“联系”和“this app can break” 等等

    为了防止这样的麻烦发生,Unicode(万国码)出现了。 Unicode是计算机科学领域里的一项行业标准,包括字符集和编码方案等。可以说,unicode就是为了解决传统字符编码方案的局限而产生的它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。计算机只要支持这种字符集,就能显示所有的字符。

    平面

    Unicode 中的编码是分区定义的, 每个区存放 65536 (2^16) 个符号, 称之为一个平面. 其中第一个平面(0-65535)被称为基本平面(BMP), 所有最常见的字符都放在这个平面

    \u0000 -> \uFFFF // 基本平面 其余的称之为辅助平面(SMP), 码点范围 \u10000 到\u10FFFF.

    编码方式

    Unicode只规定了每个字符的码点(映射关系),但是在机器编码中,到底用什么样的字节序表示这个码点,就涉及到了不同的编码方法(UTF-8/UTF-16/UTF-32)。

    UTF-32:

    这是最简单的编码方式,为什么叫utf-32呢,因为utf-32对任意单个unicode字符采用32位2进制(4个字节,一个字节等于8bit)来表示。

    \u0000 ==> 00000000 00000000 00000000 00000000 \u54c8 ==> 00000000 00000000 01010100 11001000

    优点:转换直观,简单,查找效率高。 缺点:浪费空间,不利于传输和储存。

    UTF-8:

    这是最常用的编码方式。网页,代码中大量使用这一代码。它是一种变长的编码方式。

    码点位于 0x00 - 0x7f 的字符, 只使用 1 个字节表示, 与 ASCII 完全一致. 码点位于 0x0080 - 0x07ff 的字符, 使用 2 个字节表示. 码点位于 0x0800 - 0xFFFF 的字符, 使用 3 个字节表示. 码点位于 0x010000 - 0x10FFFF 的字符, 使用 4 个字节表示.

    对于单字节的字符, 编码的第一位为 0, 后七位为该符号的 Unicode 码。 对于 n (n > 1) 字节的字符: Step1. 编码第一个字节 (8位) 的前 n 位为 1, 第 n + 1 位为 0, 其余字节 (8位) 的头 2 位都是 10 Step2. 对于剩下的空位, 使用这个符号的 Unicode 码点填充.

    UTF-16:

    UTF-16结合了UTF-32定长和UTF-8不定长的特点。 编码规则: 基本平面的字符占用2个字节,辅助平面的字符占用4个字节 。(与UTF-32相比节省了不少空间)

    编码在计算机中有何作用?

    在开发中:

    一是终端本地显示界面,如菜单、图标等 二是来自外部的文件,需要在终端上进行显示 三是网络中互传信息时,需要统一编码

    针对上面三点,都离不开Unicode,同时还要有支持各国语言的内码表及各国语言内码所对应的字库或Unicode字库。

    在使用中:

    在如今大数据时代,多语言环境是不可避免的,一个统一的编码便显得格外重要。这使得信息交流更加快捷,方便。

    转载请注明原文地址: https://ju.6miu.com/read-971799.html

    最新回复(0)