当前位置: 首页 > 科技观察

下面说一下前端字符编码:ASCII、Unicode、Base64、UTF-8、UTF-16、UTF-32

时间:2023-03-17 10:59:15 科技观察

大家好,我是CUGGZ。在开发过程中,我们经常会遇到各种编码,比如UTF-8、Unicode、Base64等等,但是前端的世界远不止这三种编码。本文介绍常见的前端编码及其使用方法。ASCII我们知道计算机只能理解二进制,而二进制语言是一种直接来自计算机指令系统的面向机器的语言,由0和1组成。它使用整数来编码数字(0-9)、大写字母(A-Z))、小写字母(A-Z)以及分号(;)、感叹号(!)等。例如用97表示“a”,用33表示“!”,可以方便地存入记忆。在互联网的早期,只有英文字母,所以你不需要担心任何其他字符。在这种情况下,ASCII可用于字符编码。例如,比特对应的二进制编码如下:“美国信息交换标准码”是一种基于拉丁字母表的计算机编码系统。ASCII至今定义了128个字符:ASCII可分为两类:可显示字符:编号范围为32-126(0x20-0x7E),共95个字符:控制字符:编号范围为0-31和127(0x00-0x1F和0x7F),一共33个字符:可以看到,ASCII码其实是二进制字符到字母数字字符的映射。所以当计算机接收到如下二进制文件时:0100100001100101011011000110110001101111001000000111011101101111011100100110110001100100是用ASCII码映射出来的,上面的二进制码可以很好的翻译成“你好K7.5”中的ASCII码将其转换为二进制,将75除以2,然后继续直到得到0。如果除法不准确,余数加1:75/2=37+137/2=18+118/2=9+09/2=4+14/2=2+02/2=1+01/2=0+1现在,提取“余数”并将它们倒序排列:1101001=>1001011因此,在ASCII中,“K”在二进制中被编码为1001011。ASCII的主要缺点是它只能表示256个不同的字符,因为它只使用8位。ASCII不能用于对世界各地发现的许多类型的字符进行编码。但是如果你想在你的电脑上使用中文、俄文或日文,你就需要不同的编码标准。Unicode进一步扩展为UTF-8、UTF-16、UTF-32对各种类型的字符进行编码。所以ASCII和Unicode之间的主要区别是用于编码的位数。让我们来看看Unicode的概念以及如何使用它。UnicodeUnicode是另一种字符编码,它仍然是:bitlookup->character,由UnicodeConsortium维护,负责开发国际通用的软件标准。IT行业对Unicode进行了标准化,以对计算机和其他电子和通信设备中的字符进行编码和表示。Unicode由许多码点组成(将世界各地的大量字符映射成所有计算机都可以参照的键),码点的集合称为字符集,这就是Unicode。Unicode的开发目标是将世界上任何语言的任何字符或符号以独特的方式转换为唯一的数字。您可以在unicode.org上查找任何Unicode字符(包括表情符号)的编号!Unicode看起来像这样:U+0048:拉丁大写字母HU+0065:拉丁小写字母eU+006C:拉丁小写字母lU+006C:拉丁小写字母lU+006F:拉丁小写字母oU+0020:空格[SP]U+0057:拉丁文大写字母WU+006F:拉丁文小写字母oU+0072:拉丁文小写字母rU+006C:拉丁文小写字母lU+0064:拉丁文小写字母d可用于以下格式将unicode序列\uXXXX添加到JavaScript字符串中:consts1='\u00E9'//é可以通过组合两个unicode序列来创建一个序列:consts2='\u0065\u0301'//é虽然两个字符串结果都是é,但是它们是两个不同的字符串并且长度不同:ASCII和Unicode是两种流行的编码方案。ASCII编码符号、数字、字母等,而Unicode编码来自不同语言的特殊文本、字母、符号等。可以说ASCII是Unicode编码方案的一个子集。它们的区别如下:UTF-8、UTF-16、UTF-32(1)基本概念UTF是一种Unicode编码方式。UTF编码由Unicode标准定义,能够对所需的每个Unicode代码点进行编码。Unicode编码方案根据用于对字符进行编码的位数进行分类。目前使用的Unicode编码方案有UTF-7、UTF-8、UTF-16、UTF-32,分别用7、8、16、32位来表示字符。那么你怎么知道文件将使用哪种编码呢?有一种叫做字节顺序标记(BOM,或字节顺序标记)的东西,也称为编码签名。BOM是文件开头的两个字节标记,用来标识文件是用哪种格式编码的。UTF-8是互联网上使用最多的,也被指定为文件的首选编码HTML5,所以下面主要介绍UTF-8。UTF-8将所有Unicode代码点0-127编码为1个字节(与ASCII相同)。这意味着如果程序以ASCII编码并且用户使用UTF-8,则不会出现错误。1993年创建UTF-8时,很多数据都是ASCII格式的,所以通过兼容UTF-8,使用前不需要转换数据。从本质上讲,ASCII格式的文件可以被视为UTF-8格式的文件,并且可以正常工作。(2)工作原理让我们仔细看看UTF-8是如何工作的,以及为什么它会根据被编码的字符而有不同的长度。UTF-8动态存储数字。Unicode列表中的第一个占用1个字节,最后一个最多占用4个字节,如果您处理的是英文文件,大多数字符可能只占用1个字节,与ASCII相同。这是通过用不同的字节数覆盖Unicode中的不同范围来实现的。例如,要对原始ASCII表中的字符(0-127)进行编码,只需要7位,因为27=128。因此可以将所有内容存储在8位的1个字节中,并且还剩下一个可用空间。而对于下一个范围(128-2047),需要11位,因为211=2048,在UTF-8中是2个字节。当计算机读取UTF-8中以0开头的内容时,它知道它只需要读取一个字节并显示Unicode中0-127范围内的正确字符。如果遇到两个1,需要读取2个字节,范围128-2047,三个1一起表示需要读取三个字节。(3)UTF-16、UTF-32世界上使用的大量字符无法使用8位表示法进行编码,导致Unicode编码下出现了UTF-16和UTF-32编码格式。在解释这些编码格式之前,我们先来看一下平面的概念:Unicode编码中有很多很多的字符,不是一次性定义的,而是分区定义的。每个区域存储65536(216)个字符。这叫做一个位面,目前一共有17个位面。前平面称为基本平面,其码位范围为0~216-1,十六进制为U+0000~U+FFFF,其余16个平面为辅助平面,码位范围为U+10000—U+10FFFF。UTF-16是Unicode码集的一种编码形式,它将Unicode字符集的抽象码点映射为一串16位长的整数(即码元),用于数据存储或传输。Unicode字符的代码点需要用一两个16位长的代码单元来表示,所以UTF-16也是用变长字节来表示的。UTF-16编码规则:U+0000—U+FFFF(常用字符集)编号的字符直接用两个字节表示。U+10000—U+10FFFF之间的字符需要用四个字节来表示。那么问题来了,遇到两个字节,怎么知道是把它当成一个字符还是把它当成后面两个字节的字符呢?UTF-16编码也必须考虑到这个问题。在基本平面中,从U+D800到U+DFFF是一个空段,也就是说这个区间的码点不对应任何字符,所以这些空段可以用来映射辅助的字符飞机。辅助平面一共有220个字符位,所以至少需要20个二进制位来表示这些字符。UTF-16将这20个二进制位分成两半。前10位映射到U+D800—U+DBFF,称为高位(H),后10位映射到U+DC00—U+DFFF,称为低位(L)。这相当于将辅助位面的一个字符拆分为两个基本位面的字符。因此,当我们遇到两个字节,发现它的码位在U+D800—U+DBFF之间,我们就可以知道接下来两个字节的码位应该在U+DC00—U+DFFF之间,这四个字节一定一起阅读。经过”