大家好,我们在开发过程中经常会遇到各种编码。 常见的有UTF-8、UTF-8、UTF-8等,但前端世界远不止这三种编码。 本文将介绍前端常见的编码以及如何使用。 。

编码Unicode_unicode编码_unicode编码漏洞

ASCII码

我们知道计算机只能理解二进制。 二进制语言是一种面向机器的语言,直接来自于计算机的指令系统,由0和1组成。 它使用整数来编码数字(0-9)、大写字母(AZ)、小写字母(AZ),以及分号(;)、感叹号(!)等。例如,97用于表示“a ”而33用来表示“!”,这样可以方便的存储在内存中。

在互联网的早期,只有英文字母,所以不需要担心任何其他字符。 在这种情况下,可以将 ASCII 应用于字符编码。 例如bit对应的二进制如下:

01100010 01101001 01110100 01110011
   b        i        t        s

ASCII 代表 Code for,即“美国信息交换标准代码”。 它是一种基于拉丁字母的计算机编码系统。 到目前为止 ASCII 共定义了 128 个字符:

unicode编码漏洞_unicode编码_编码Unicode

ASCII 可以分为两类:

编码Unicode_unicode编码漏洞_unicode编码

编码Unicode_unicode编码_unicode编码漏洞

正如你所看到的,ASCII码实际上是从二进制字符到字母数字字符的映射。 那么当计算机收到如下二进制文件时:

01001000 01100101 01101100 01101100 01101111 00100000 01110111 01101111 01110010 01101100 01100100

使用ASCII码进行映射,上述二进制编码可以翻译为“Hello world”。

“K”在 ASCII 中是 75。 要将其转换为二进制,请将 75 除以 2 并继续,直到得到 0。如果除法不精确,则加 1 作为余数:

75 / 2 = 37 + 1
37 / 2 = 18 + 1
18 / 2 =  9 + 0
9 / 2 =   4 + 1
4 / 2 =   2 + 0
2 / 2 =   1 + 0
1 / 2 =   0 + 1

现在,提取“余数”并将它们按相反的顺序排列:

1101001 => 1001011 

因此,在 ASCII 中,“K”以二进制编码为 。

ASCII 的主要缺点是它只能表示 256 个不同的字符,因为它只能使用 8 位。 ASCII 不能用于对世界各地发现的许多类型的字符进行编码。 但如果你想在计算机上使用中文、俄语和日语,则需要不同的编码标准。 进一步扩展到UTF-8、UTF-16、UTF-32来编码各种类型的字符。 因此,ASCII 和 ASCII 之间的主要区别在于用于编码的位数。 让我们看一下这些概念以及如何使用它们。

unicode编码_编码Unicode_unicode编码漏洞

是另一种字符编码,它仍然是:位查找->字符,由 维护,负责制定国际使用的软件标准。 IT 行业将标准化计算机和其他电子和通信设备中字符的编码和表示。

由许多代码点(将世界各地的大量字符映射到所有计算机都可以引用的键)组成,代码点的集合称为字符集。 开发的目标是以独特的方式将世界上任何语言的任何字符或符号转换为唯一的数字。 查找任何字符的编号,包括表情符号!

它看起来像这样:

U+0048:拉丁文大写字母 H
U+0065:拉丁文小写字母 e
U+006C:拉丁文小写字母 l
U+006C:拉丁文小写字母 l
U+006F:拉丁文小写字母 o
U+0020:空格 [SP]
U+0057:拉丁文大写字母 W
U+006F:拉丁文小写字母 o
U+0072:拉丁文小写字母 r
U+006C:拉丁文小写字母 l
U+0064:拉丁文小写字母 d

可以使用以下格式将序列 uXXXX 添加到字符串中:

const s1 = 'u00E9' //é

可以通过组合两个序列来创建序列:

const s2 = 'u0065u0301' //é

虽然两个字符串的结果都是 é,但它们是两个不同的字符串并且具有不同的长度:

unicode编码漏洞_编码Unicode_unicode编码

ASCII 和 ASCII 是两种流行的编码方案。 ASCII 对符号、数字、字母等进行编码,对不同语言的特殊文本、字母、符号等进行编码。可以说 ASCII 是编码方案的子集。 它们之间的区别如下:

unicode编码漏洞_unicode编码_编码Unicode

编码Unicode_unicode编码漏洞_unicode编码

UTF-8、UTF-16、UTF-32

(一)基本概念

UTF是一种编码方法。 UTF 编码由标准定义,能够对所需的每个代码点进行编码。 编码方案根据用于编码字符的位数进行分类。 目前使用的编码方案有UTF-7、UTF-8、UTF-16和UTF-32,分别使用7位、8位、16位和32位来表示字符。

那么你如何知道文件将使用哪种编码呢? 有一种叫做字节顺序标记(BOM,或字节顺序标记)的东西,也称为编码签名。 BOM是文件开头的两个字节标记,用于标识文件采用哪种格式编码。

UTF-8是互联网上使用最多的,也被指定为HTML5中文档的首选编码,所以下面将主要介绍UTF-8。

unicode编码漏洞_unicode编码_编码Unicode

UTF-8 将所有代码点 0-127 编码为 1 个字节(与 ASCII 相同)。 这意味着如果程序以 ASCII 编码并且用户使用 UTF-8,则不会出现错误。 1993年创建UTF-8时,很多数据都是ASCII格式,因此通过兼容UTF-8,使用前无需转换数据。 本质上,ASCII 格式的文件可以被视为 UTF-8 格式的文件,并且它们可以正常工作。

(二)工作原理

让我们仔细看看 UTF-8 的工作原理以及为什么它根据所编码的字符而具有不同的长度。

UTF-8 动态存储数字。 列表中的第一个字符占用 1 个字节,最后一个字符最多占用 4 个字节,如果您处理的是英文文件,则大多数字符可能只占用 1 个字节,与 ASCII 中的相同。 这是通过覆盖不同字节数的不同范围来实现的。

例如,要对原始 ASCII 表 (0-127) 中的字符进行编码,只需要 7 位,因为 27 = 128。因此可以将所有内容存储在 8 位的 1 个字节中,并且仍然剩余 1 个可用空间。 对于下一个范围(128-2047),需要 11 位,因为 211=2048,在 UTF-8 中是 2 个字节。

编码Unicode_unicode编码_unicode编码漏洞

当计算机读取 UTF-8 中以 0 开头的内容时,它知道只需要读取一个字节并显示 0-127 范围内的正确字符。 如果遇到两个1,则需要读取2个字节,范围为128-2047。 三个1在一起表示需要读取三个字节。

unicode编码漏洞_unicode编码_编码Unicode

(3)UTF-16、UTF-32

世界各地使用的大量字符无法全部使用 8 位表示进行编码,从而产生了 UTF-16 和 UTF-32 编码格式。 在解释这些编码格式之前,我们先来看看平面的概念:

编码中有很多很多的字符,这些字符不是一次性定义的,而是分区定义的。 每个区域存储65536(216)个字符,称为一个平面。 目前共有17架飞机。 第一个平面称为基本平面。 其代码点范围为 0 – 216-1,即十六进制的 U+0000 – U+FFFF。 其余16个平面为辅助平面,码点范围为U+10000—U+。

UTF-16是编码集的一种编码形式,它将字符集的抽象码点映射成16位长整数(即码元)序列,用于数据存储或传输。 一个字符的码位需要1或2个16位长的码元来表示,因此UTF-16也是用变长字节来表示的。

UTF-16编码规则:

那么问题来了,当遇到两个字节时,怎么知道是把它当作一个字符,还是和后面的两个字节一起当作一个字符呢?

UTF-16编码也必须考虑到这个问题。 在基本平面中,从U+D800到U+DFFF是一个空段,也就是说这个区间内的码点不对应任何字符,因此这些空段可以用来映射辅助的字符飞机。

辅助平面共有220个字符位,因此至少需要20个二进制位来表示这些字符。 UTF-16 将这 20 个二进制位分成两半。 前10位映射到U++DBFF,称为高位(H),后10位映射到U++DFFF,称为低位(L)。 这相当于把一个辅助平面字符拆成两个基本平面字符来表示。

因此,当我们遇到两个字节,发现其码点在 U+D800 — U+DBFF 之间时,我们可以知道接下来的两个字节的码点应该在 U+DC00 — U+ DFFF 之间,这四个字节一定是一起解读。

以“”字为例。 它的代码点是。 该码位超出了基本平面的范围,因此需要用四个字节来表示。 步骤如下:

UTF-32是字符对应的数字的整数二进制形式。 每个字符占用四个字节。 这个是直接换算的。 这种编码方式占用存储空间较多,因此较少使用。 比如“马”这个词的编号是:U+9A6C,整数是39532,直接转换成二进制:1 1100,就是它的UTF-32编码。

(4)指定编码方式

如果没有明确指定编码,浏览器会假定任何程序的源代码都是使用本地字符集编写的,该字符集因国家/地区而异,并且可能会出现意外行为。 因此,设置文档的字符集非常重要。 那么如何指定UTF编码呢?

好了,今天的主题就讲到这里吧,不管如何,能帮到你我就很开心了,如果您觉得这篇文章写得不错,欢迎点赞和分享给身边的朋友。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注