编程题:URL编码(url_encoding)
上网时经常遇到带很多百分号的网址,比如这种:https://zh.wikipedia.org/wiki/%E7%99%BE%E5%88%86%E5%8F%B7%E7%BC%96%E7%A0%81
后面那些密码似的字符串在浏览器地址栏其实是“百分号编码”5个中文字符。
读了WiKi后(就是上面的网址)我才明白这么做是有原因的:? # /等**保留字符**在URL中有特殊含义(回想《URL解析》那道题)。如果URL本身含保留字符、控制字符、非ASCII字符,那么要用百分号编码。具体方法:
- 字母、数字、- _ . ~称为**非保留字符**,原样输出。
- 非保留字符**不得编码**,否则有安全风险。
- 其他字符**必须编码**:将各字节数值按十六进制输出并前缀%。例如百分号(编码0x25)表示为%25
- 对于十六进制数字中的字母遵循**宽进严出**的原则:编码输出时必须**大写**。读入解码时则大小写均可接受。
任务:实现URL编码、解码的功能。
参考标准:[RFC3986](https://www.ietf.org/rfc/rfc3986.txt)
#### 输入规格
- 首先是两个非负整数E、U表示编码行数、解码行数。
- 之后是E行待编码的数据,每行由若干0到255的数值构成,每个数代表一个字节,空白分隔。
- 然后是U行待解码的数据,每行一个URL编码后的字符序列。
- 数据请用string保存,无需考虑长度范围。
#### 输出规格
- 输出共E+U行。
- 前E行输出编码结果。
- 后U行输出解码后的字节序列,十进制输出,间隔一个**空格**。
- 如果编码序列无效,输出invalid。
#### 样例输入
in
1 2
104 101 108 108 111 44 32 119 111 114 108 100
hello%2C%20world
%41
#### 样例输出
out
hello%2C%20world
104 101 108 108 111 44 32 119 111 114 108 100
invalid
#### 样例解释
- 第1行:编码有1组数据、解码有2组数据。
- 第2行:有12字节,原文是hello, world。其中字母原样输出,**逗号和空格**需要编码。
- 第3行:就是上行编码后的结果,解码、然后逐字节输出。
- 第4行:%41,编码0x41对应字符A,但A不是保留字符,不应编码,输出invalid。
答案:若无答案欢迎评论
后面那些密码似的字符串在浏览器地址栏其实是“百分号编码”5个中文字符。
读了WiKi后(就是上面的网址)我才明白这么做是有原因的:? # /等**保留字符**在URL中有特殊含义(回想《URL解析》那道题)。如果URL本身含保留字符、控制字符、非ASCII字符,那么要用百分号编码。具体方法:
- 字母、数字、- _ . ~称为**非保留字符**,原样输出。
- 非保留字符**不得编码**,否则有安全风险。
- 其他字符**必须编码**:将各字节数值按十六进制输出并前缀%。例如百分号(编码0x25)表示为%25
- 对于十六进制数字中的字母遵循**宽进严出**的原则:编码输出时必须**大写**。读入解码时则大小写均可接受。
任务:实现URL编码、解码的功能。
参考标准:[RFC3986](https://www.ietf.org/rfc/rfc3986.txt)
#### 输入规格
- 首先是两个非负整数E、U表示编码行数、解码行数。
- 之后是E行待编码的数据,每行由若干0到255的数值构成,每个数代表一个字节,空白分隔。
- 然后是U行待解码的数据,每行一个URL编码后的字符序列。
- 数据请用string保存,无需考虑长度范围。
#### 输出规格
- 输出共E+U行。
- 前E行输出编码结果。
- 后U行输出解码后的字节序列,十进制输出,间隔一个**空格**。
- 如果编码序列无效,输出invalid。
#### 样例输入
in
1 2
104 101 108 108 111 44 32 119 111 114 108 100
hello%2C%20world
%41
#### 样例输出
out
hello%2C%20world
104 101 108 108 111 44 32 119 111 114 108 100
invalid
#### 样例解释
- 第1行:编码有1组数据、解码有2组数据。
- 第2行:有12字节,原文是hello, world。其中字母原样输出,**逗号和空格**需要编码。
- 第3行:就是上行编码后的结果,解码、然后逐字节输出。
- 第4行:%41,编码0x41对应字符A,但A不是保留字符,不应编码,输出invalid。
答案:若无答案欢迎评论