编码的学习

Hex编码

Hex编码的编码原理:
Hex编码的原理就是将原来8位的二进制字节打断,分成两个4位的,并且在前面加上4个零,
进行补位这样一个8位二进制字节就变成了2个8位的二进制字节,在将新得到的2个二进制字符进行16位进制转换
得到的新的16位字符串就是Hex的值

例子:
字符串: HEX
ASCII码: [72,69,88]
二进制码: ‭01001000‬ ‭01000101‬ ‭01011000‬
重新分组: 0100 1000 0100 0101 0101 1000
高位补零后的二进制码: 00000100 00001000 00000100 00000101 00000101 00001000
十六进制码: 4 8 4 5 5 8
Hex码: 484558

ASCII编码

在这里插入图片描述
在这里插入图片描述

URL编码

在这里插入图片描述

Quoted-printable编码

Quoted-printable 可译为“可打印字符引用编码”、“使用可打印字符的编码”,我们收邮件,查看信件原始信息,经常会看到这种类型的编码!
最多时候,我们在邮件头里面能够看到这样的编码!
Content-Transfer-Encoding:quoted-printable

它是多用途互联网邮件扩展(MIME) 一种实现方式。其中MIME是一个互联网标准,它扩展了电子邮件标准,致力于使其能够支持非ASCII字符、二进制格式附件等多种格式的邮件消息。目前http协议中,很多采用MIME框架!quoted-printable 就是说用一些可打印常用字符,表示一个字节(8位)中所有非打印字符方法!

Quoted-printable编码方法
任何一个8位的字节值可编码为3个字符:一个等号”=”后跟随两个十六进制数字(0–9或A–F)表示该字节的数值.例如,ASCII码换页符(十进制值为12)可以表示为”=0C”, 等号”=”(十进制值为61)必须表示为”=3D”. 除了可打印ASCII字符与换行符以外,所有字符必须表示为这种格式.
所有可打印ASCII字符(十进制值的范围为33到126)可用ASCII字符编码来直接表示, 但是等号”=”(十进制值为61)不可以这样直接表示.ASCII的水平制表符(tab)与空格符, 十进制为9和32, 如果不出现在行尾则可以用其ASCII字符编码直接表示。如果这两个字符出现在行尾,必须QP编码表示为”=09″ (tab)或”=20″ (space).
如果数据中包含有意义的行结束标志,必须转换为ASCII回车(CR)换行(LF)序列,既不能用原来的ASCII字符也不能用QP编码的”=”转义字符序列。 相反,如果字节值13与10有其它的不是行结束的含义,它们必须QP编码为=0D与=0A.
quoted-printable编码的数据的每行长度不能超过76个字符. 为满足此要求又不改变被编码文本,在QP编码结果的每行末尾加上软换行(soft line break). 即在每行末尾加上一个”=”, 但并不会出现在解码得到的文本中.

例如:If you believe that truth=beauty, then surely mathematics is the most beautiful branch of philosophy. 编码后结果是
If you believe that truth=3Dbeauty, then surely=20=
mathematics is the most beautiful branch of philosophy.

编码里面,有几个特定限定,一些可打印字符不用编码,当然如果你按照规范编码后,也一样可以显示的!因此自己简单自己实现该编码:

function quoted_printable_encode($string) {
    
     
    return preg_replace('/[^\r\n]{73}[^=\r\n]{2}/', "$0=\r\n", str_replace("%","=",
rawurlencode($string))); 
} 

一个函数就可以,将所有字符串urlencode转换后,%号替换为”=”号,然后对非\r\n超过73连续字符,后面加一个=\r\n。这个是简单实现方法! 按照该编码详细说明里面,有些空格、换行,还有一些特殊字符可以不用转换。不过一起转换了,也不会有影响!

PHP中可以使用下面1对函数进行编码和解码:

quoted_printable_encode() 函数把 8 位字符串转换为 quoted-printable 字符串。
quoted_printable_decode() 对经过 quoted-printable 编码后的字符串进行解码,返回 8 位的 ASCII 字符串

很多时候,我们用些常见字符表示所有8位其它非打印字符,这种通过,Quoted-printable编码,只是对该字节转为16进制后,做简单增加前缀!然后做些特殊字符处理即可! 它的简单,及编码高效,也让该编码在邮件格式里面,得到了广泛使用!

Mimetypes

完整的 mime type 列表

HTML编码

/// <summary>
        /// 对文本框中的字符进行HTML编码
        /// </summary>
        /// <param name="str">源字符串</param>
        /// <returns></returns>
        public static string HtmlEncode(string str)
        {
    
    
            str = str.Replace("&", "&amp;");
            str = str.Replace("'", "''");
            str = str.Replace("\"", "&quot;");
            str = str.Replace(" ", "&nbsp;");
            str = str.Replace("<", "&lt;");
            str = str.Replace(">", "&gt;");
            str = str.Replace("\n", "<br>");
            return str;
        }

Escape编码

所有空格、标点符号、重音字符,以及任何其他非ASCII字符都编码改为"%XX"的形式,xx是16进制数字所代表.
    escape和unescape的编码和解码功能, escape返回16进制编码的一种ISO拉丁字符集. unescape的功能将具有特殊值的16进制编码转换为ASCII字符串

    举例: 
      escape('!@#$%^&*(){}[]=:/;?+\'"'): 
结果:%21@%23%24%25%5E%26*%28%29%7B%7D%5B%5D%3D%3A/%3B%3F+%27%22 

escape不编码字符有69个:*,+,-,.,/,@,_,0-9,a-z,A-Z

encodeURI(

Encodeuri方法返回一个编码后的URI. 因此,如果你将其结果用Decodeuri方法,原始的串会返回. Encodeuri的方法并不对以下字符编码:":"、"/"、"; “、”? ". 但可以使用 encodeuricomponent 的方法对这些字符进行encode.
  encodes,一种 Uniform Resource Identifier (URI)(URI)逐一替换某些字符,描述为UTF-8编码的特点.
  例如 : encodeURI('!@#$%^&*(){}[]=:/;?+\'"'):
     结果:!@#$%25%5E&*()%7B%7D%5B%5D=:/;?+’%22

encodeURI不编码字符有82个:!,#,$,&,’,(,),*,+,,,-,.,/,:,;,=,?,@,_,~,0-9,a-z,A-Z

encodeURIComponent(

encodeuricomponent 方法返回一个编码的URI. 因此,如果你将decodeuricomponent,原来的串会返回. 由于所有文字encodesencodeuricomponent方法都会进行编码,所以要小心,如果存在路径等串例如:   “/FOLDER1/FOLDER2/DEFAULT.HTML”. 加密后并不会,如果作为一个网络服务器的请求将会失效. 使用这种方法Encodeuri当字符串超过一个以上URI组成.
 encodes,一种 Uniform Resource Identifier (URI)(URI)逐一替换某些字符,描述为UTF-8编码的特点.
  例子:最简单的方法就是看它们加密这些字符后生成的代码.
    encodeURIComponent('!@#$%^&*(){}[]=:/;?+\'"'):
    结果 !%40%23%24%25%5E%26*()%7B%7D%5B%5D%3D%3A%2F%3B%3F%2B’%22

encodeURIComponent不编码字符有71个:!, ',(,),*,-,.,_,~,0-9,a-z,A-Z

GBK 编码

GB2312

后来中国用计算机,但ASCII编码不支持中文。咋办,中国自己搞了一个 GB2312。但只能标识大约7000个汉子

两个字节 16位二进制(当字符小于127位时,与ASCII的字符相同,但当两个大于127的字符连接在一起时,就代表一个汉字)

GBK

中国汉子多,还有繁体字,7000个不够,咱办,在GB2312上继续扩展,重新定义规则,同时新增了近20000个新的汉字(包 括繁体字)和符号。

两个字节 16位二进制 (不在要求低字节一定是127之后的编码,只要第一个字节是大于127,就固定表示这是一个汉字的 开始,不管后面跟的是不是扩展字符集里的内容)

GB18030

又叫“DBCS”,又有问题了,中国有56个民族,所以,我们再次对编码规则进行了扩展,又加了近几千个少数民族的字符

Unicode编码

最全unicode编码

UTF-8编码

UTF8编码表

在这里插入图片描述
UTF-8和Unicode与GBK的关系:

utf-8-------- decode(解码)----->>Unicode类型<<-------decode(解码)----- gbk

utf-8<<--------encode(编码)----->>Unicode类型<<-------encode(编码)----->>gbk

UTF-16

UTF-16 (16-bit Unicode Transformation Format) 属于变长(variable-length)编码。Windows、Java、JavaScript内部使用UTF-16,在Unix/Linux/MacOS的文件中很少使用。出于安全原因,WHATWG(Web Hypertext Application Technology Working Group)不推荐在web中使用UTF-16,网页只占0.01%。

U+0000 ~ U+D7FF and U+E000 ~ U+FFFF

这个范围内,UTF-16和UCS-2的码点对应,都是16-bit表示。Unicode 9.0中modern non-latin Asian, Middle-eastern and African scripts还有most emoji characters,不在这个范围。

U+10000 ~ U+10FFFF

补充平面的码点编码需要两个16-bit,称为”代理对(surrogate pairs)”。规则如下:

/*
(1) Unicode - 0x010000,剩下20-bit,范围0x000000 ~ 0x0FFFFF
(2) 高10位(0x0000 ~ 0x03FF),加上0xD800,范围(0xD800 ~ 0XDBFF),得前16-bit
    称为"高代理(high/leading surrogate)"
(3) 低10位(0x0000 ~ 0x03FF),加上0xDC00,范围(0xDC00 ~ 0XDFFF),得后16-bit
    称为"低代理(low/trailing surrogate)",注意low surrogate的code-unit大于high surrogate
*/
U+D800 ~ U+DFFF

Unicode标准永久保留U+D800 ~ U+DFFF作为UTF-16编码的高低代理,它们不会被赋值,也不应该对它们编码。Unicode标准指出,没有UTF格式(包括UTF-16)编码它们。UCS-2, UTF-8, and UTF-32在一些场合,包括许多软件进行了编码,应该认为是编码错误。

UTF-16编码示例
以U+24B62为例,转为UTF-16分为3步:

/*
(1) 0x24B62 - 0x10000 = 0x14B62
(2) 高代理位(high surrogate),高10位(00 0101 0010 / 0x400)除以0x400,再加0xD800求和
    (00 0101 0010 / 0x400) + 0xD800 = 0xD852
(3) 低代理位(low surrogate),低10位加上0xDC00求和
    低10位(11 0110 0010) + 0xDC00 = 0xDF62
*/

在这里插入图片描述

UTF-32

UTF-32 (或 UCS-4)是一种将Unicode字符编码的协定,对每一个Unicode码位使用恰好32位元。其它的Unicode transformation formats则使用不定长度编码。因为UTF-32对每个字符都使用4字节,就空间而言,是非常没有效率的。特别地,非基本多文种平面的字符在大部分文件中通常很罕见,以致于它们通常被认为不存在占用空间大小的讨论,使得UTF-32通常会是其它编码的二到四倍。虽然每一个码位使用固定长定的字节看似方便,它并不如其它Unicode编码使用得广泛。

猜你喜欢

转载自blog.csdn.net/qq_51558360/article/details/114131366
今日推荐