编程题:URL编码(url_encode)
上网时经常遇到带很多百分号的网址,比如这种:https://zh.wikipedia.org/wiki/%E7%99%BE%E5%88%86%E5%8F%B7%E7%BC%96%E7%A0%81
后面那些密码似的字符串在浏览器地址栏其实是“百分号编码”5个中文字符。
读了WiKi后(就是上面的网址)我才明白这么做是有原因的:/ ? #等**保留字符**在URL中有特定功能。
对URL本身含有保留字符(非功能用途)、控制字符(换行等)、非ASCII字符(中文等),那么要用百分号转义编码。具体方法:
- 字母、数字、- _ . ~称为**非保留字符**,原样输出。
- 非保留字符**不得编码**,否则有安全风险。
- 其他字符**必须编码**:将各字节数值按十六进制输出并前缀%。例如百分号(编码0x25)表示为%25
- 对于十六进制数字中的字母遵循**宽进严出**的原则:编码输出时必须**大写**。读入解码时则大小写均可接受。
URL编码还可作为一种二进制数据的序列化方案,优点是文本内容基本保持方便直接查看、不含空格便于整串读入,缺点是体积平均膨胀250%。
任务:实现URL编码的功能。
参考:[RFC3986](https://www.ietf.org/rfc/rfc3986.txt)
先导题目:《URL解析》
#### 输入规格
- 每行一组待编码的数据,由若干0到255的数值构成,每个数代表字符串的一个字节,空白分隔。
- 数据可用string保存。本题不考察时空复杂度。
#### 输出规格
- 每行输出一个URL编码后的字符串。
#### 样例输入
in
104 101 108 108 111 44 32 119 111 114 108 100
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255
#### 样例输出
out
hello%2C%20world
%00%01%02%03%04%05%06%07%08%09%0A%0B%0C%0D%0E%0F%10%11%12%13%14%15%16%17%18%19%1A%1B%1C%1D%1E%1F%20%21%22%23%24%25%26%27%28%29%2A%2B%2C-.%2F0123456789%3A%3B%3C%3D%3E%3F%40ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D~%7F%80%81%82%83%84%85%86%87%88%89%8A%8B%8C%8D%8E%8F%90%91%92%93%94%95%96%97%98%99%9A%9B%9C%9D%9E%9F%A0%A1%A2%A3%A4%A5%A6%A7%A8%A9%AA%AB%AC%AD%AE%AF%B0%B1%B2%B3%B4%B5%B6%B7%B8%B9%BA%BB%BC%BD%BE%BF%C0%C1%C2%C3%C4%C5%C6%C7%C8%C9%CA%CB%CC%CD%CE%CF%D0%D1%D2%D3%D4%D5%D6%D7%D8%D9%DA%DB%DC%DD%DE%DF%E0%E1%E2%E3%E4%E5%E6%E7%E8%E9%EA%EB%EC%ED%EE%EF%F0%F1%F2%F3%F4%F5%F6%F7%F8%F9%FA%FB%FC%FD%FE%FF
#### 样例解释
- 第1行:共12字节,原文是hello, world。字母原样输出,**逗号和空格**需要编码。
- 第2行:共256字节,对所有可能的字符编码。
答案:若无答案欢迎评论
后面那些密码似的字符串在浏览器地址栏其实是“百分号编码”5个中文字符。
读了WiKi后(就是上面的网址)我才明白这么做是有原因的:/ ? #等**保留字符**在URL中有特定功能。
对URL本身含有保留字符(非功能用途)、控制字符(换行等)、非ASCII字符(中文等),那么要用百分号转义编码。具体方法:
- 字母、数字、- _ . ~称为**非保留字符**,原样输出。
- 非保留字符**不得编码**,否则有安全风险。
- 其他字符**必须编码**:将各字节数值按十六进制输出并前缀%。例如百分号(编码0x25)表示为%25
- 对于十六进制数字中的字母遵循**宽进严出**的原则:编码输出时必须**大写**。读入解码时则大小写均可接受。
URL编码还可作为一种二进制数据的序列化方案,优点是文本内容基本保持方便直接查看、不含空格便于整串读入,缺点是体积平均膨胀250%。
任务:实现URL编码的功能。
参考:[RFC3986](https://www.ietf.org/rfc/rfc3986.txt)
先导题目:《URL解析》
#### 输入规格
- 每行一组待编码的数据,由若干0到255的数值构成,每个数代表字符串的一个字节,空白分隔。
- 数据可用string保存。本题不考察时空复杂度。
#### 输出规格
- 每行输出一个URL编码后的字符串。
#### 样例输入
in
104 101 108 108 111 44 32 119 111 114 108 100
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255
#### 样例输出
out
hello%2C%20world
%00%01%02%03%04%05%06%07%08%09%0A%0B%0C%0D%0E%0F%10%11%12%13%14%15%16%17%18%19%1A%1B%1C%1D%1E%1F%20%21%22%23%24%25%26%27%28%29%2A%2B%2C-.%2F0123456789%3A%3B%3C%3D%3E%3F%40ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D~%7F%80%81%82%83%84%85%86%87%88%89%8A%8B%8C%8D%8E%8F%90%91%92%93%94%95%96%97%98%99%9A%9B%9C%9D%9E%9F%A0%A1%A2%A3%A4%A5%A6%A7%A8%A9%AA%AB%AC%AD%AE%AF%B0%B1%B2%B3%B4%B5%B6%B7%B8%B9%BA%BB%BC%BD%BE%BF%C0%C1%C2%C3%C4%C5%C6%C7%C8%C9%CA%CB%CC%CD%CE%CF%D0%D1%D2%D3%D4%D5%D6%D7%D8%D9%DA%DB%DC%DD%DE%DF%E0%E1%E2%E3%E4%E5%E6%E7%E8%E9%EA%EB%EC%ED%EE%EF%F0%F1%F2%F3%F4%F5%F6%F7%F8%F9%FA%FB%FC%FD%FE%FF
#### 样例解释
- 第1行:共12字节,原文是hello, world。字母原样输出,**逗号和空格**需要编码。
- 第2行:共256字节,对所有可能的字符编码。
答案:若无答案欢迎评论