003_&#x和ASCII的关系及URL中的中文转义

一、&#x和ASCII的关系

以下是常用的,在博客园的插入代码块&#+数字后浏览器也会自动把这些字符数字控制符给显示出来;

  -> 空格 (ASCII码_可显示字符: 32十进制)
( -> (   (ASCII码_可显示字符: 40十进制)
) -> )   (ASCII码_可显示字符: 41十进制)
- -> -   (ASCII码_可显示字符: 45十进制)
: -> :   (ASCII码_可显示字符: 58十进制)
. -> .   (ASCII码_可显示字符: 46十进制)



 -> 换行符 (ASCII码_控制字符: 10十进制)

Reference: http://ascii.911cha.com/

将这一堆“乱码”保存成网页后,通过浏览器打开又可以正常显示。它的学名叫实体编码 entity code. 

在 HTML 中,某些字符是预留的,例如小于号「<」、大于号「>」等,浏览器会将它们视作标签。如果想要在HTML中显示这些预留字符,我们就要用到字符实体(character entities)。我们比较熟悉的字符实体有空格「&nbsp;」,小于号「&lt;」,大于号「&gt;」等。这样的格式比较语义化,容易记忆,但其实字符实体有其他的格式:

&name;
&#dddd;
&#xhhhh;

1. 这三种转义方式都称作 character reference,第一种是 character entity reference,「&」符号后接预先定义好的 entity 名称。

2. 后两种是 numeric character reference,数字取值为目标字符的 Unicode code point;以「&#」开头的后接十进制数字,「&#x」开头的后接十六进制数字。

从 HTML4 开始,numeric character reference 以 Unicode 为准,与文档编码无关。「你好」二字分别是 Unicode 字符 U+4F60 和 U+597D,十六进制表示的 code point 数值「4F60」和「597D」,同时也就是十进制的「20320」和「22909」。所以

在HTML中输入

 &#x4F60;&#x597D;
&#20320;&#22909;

都会显示为“你好”。

Reference: https://www.cnblogs.com/philipding/p/10153094.html 

二、URL中的中文转义

(1)编写一个测试的网页地址:

路径如为: TEST/你好/index.html,浏览器显示为:

(2)查看该网页的请求头:

Request URL:
http://127.0.0.1:5500/TEST/%E4%BD%A0%E5%A5%BD/index.html
①浏览器对中文路径URL的转义,如上,虽然在 href 中是直接写的中文,但浏览器悄悄地做了转义。当然你也可以自己先行转义好放在 href 那,这样浏览器就不会再转了。
②为什么URL中中文需要转义: 这个原因简单讲就是 URL 中的规范就是这么规定的。
更准确地说是 URI 规范。URL 是 URI 的一种,常见的 URI 通常也都是 URL,一般情况下会混着用两者。关于 URI 规范,具体可见 http://www.ietf.org/rfc/rfc2396.txt 和 http://www.ietf.org/rfc/rfc3986.txt。(后面的为更新的规范)

③URL中的转义表示:

像这样的一串字符"%E4%BD%A0%E5%A5%BD", 其中的每一个部分用【%XX】来表示,其中 XX 表示一个十六进制的数(hexadecimal digits),这样的表示就是所谓的“URL 的转义表示”,也叫“百分号编码”(Percent-Encoding)。如果把其中的百分号 % 去掉,会发现结果是"E4 BD A0 E5 A5 BD",总共 6 个字节,其实就是“主页”两字的 utf-8 编码。

如果你还记得先前说到的 utf-8 的编码模式(参见大神博客: https://xiaogd.net/%e5%ad%97%e7%ac%a6%e9%9b%86%e4%b8%8e%e7%bc%96%e7%a0%81%ef%bc%88%e5%9b%9b%ef%bc%89-unicode/ ),EX XX XX 通常就是常用汉字的模式。

那么现在比较清楚了,URL 路径中的中文需要转义,具体编码用的是 utf-8。包括本文粘贴的地址也是一样.

三、第二中所描述即为"百分比编码"或"URL编码"

百分比编码 是一种拥有8位字符编码的编码机制,这些编码在URL的上下文中具有特定的含义。它有时被称为URL编码。编码由英文字母替换组成:“%” 后跟替换字符的ASCII的十六进制表示

需要编码的特殊字符有: ':''/''?''#''['']''@''!''$''&'"'"'('')''*''+'','';''=',以及,'%' 本身. 其他的字符虽然可以进行编码但是不需要。

根据上下文, 空白符 ' ' 将会转换为 '+' (必须在HTTP的POST方法中使定义 application/x-www-form-urlencoded  传输方式), 或者将会转换为 '%20' 的 URL。

原文地址:https://www.cnblogs.com/arun-python/p/13068952.html