前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >URL编码中的空格(编码以后变为+)

URL编码中的空格(编码以后变为+)

作者头像
子勰
发布2018-05-22 10:30:43
3K0
发布2018-05-22 10:30:43
举报
文章被收录于专栏:子勰随笔

最近测试MM反映查看Log的时候会在有些请求中看到“+”,但是最后的结果却没有问题。当时感觉很诡异,走读代码定位发现是因为调用了java.net.URLEncoder的方法出现。后来研究发现才发现没这么简单啊。

总结:在HTML4.0.1中,基于RFC-1738标准,‘ ’在URL编码以后为 ‘+’,只有JS中由于基于RFC-2396标准,‘ ’在URL编码以后为‘%20’。

java代码:

代码语言:javascript
复制
代码片段:
    String tempString = "Hello, World!";
    String temStringAfterEncode = "";

    try {
        temStringAfterEncode = java.net.URLEncoder.encode(tempString,"UTF-8");
    } catch (java.io.UnsupportedEncodingException e) {
        Log.i("UrlDemo", "bad encoding type"); 
    }

    Log.i("UrlDemo", tempString); 
    Log.i("UrlDemo", temStringAfterEncode); 

    android.net.Uri.encode(tempString);
    Log.i("UrlDemo", tempString); 
    Log.i("UrlDemo", temStringAfterEncode); 


结果如下:

    07-21 11:47:28.695: I/UrlDemo(1222): Hello, World!
    07-21 11:47:28.695: I/UrlDemo(1222): Hello%2C+World%21
    07-21 11:47:28.705: I/UrlDemo(1222): Hello, World!
    07-21 11:47:28.705: I/UrlDemo(1222): Hello%2C+World%21

走读代码发现java将’ ‘转成了’+’。由于之前做过比较久web前端,映像中URL编码规则应该是将空格转为%20。上网看了下,又貌似都是对的,决定试一试。先用站长工具测试了一下URL Encode(如下图),瞬间晕倒,竟然‘+’才是主流的。

地址: http://tool.chinaz.com/Tools/URLEncode.aspx 编码结果:

tool.chinaz编码结果
tool.chinaz编码结果

仍不死心,继续用php测试一番。

PHP代码

代码语言:javascript
复制
代码片段:     
     $tempString = "Hello, World!";
     $temStringAfterEncode = urlencode($tempString);
     echo $tempString ."\n".$temStringAfterEncode."\n";
执行结果:
    $ /usr/bin/php ./urlDemo.php 
    Hello, World!
    Hello%2C+World%21

·

再次崩溃,是谁伤害了我?

最后用JS试一下:

JS 测试 URL encode
JS 测试 URL encode

好吧,原来是JS坑了我,罪魁祸首是JS,这到底是为什么呢?

怒而翻身回去google一把,在W3C找到HTML标准,根据HTML4.01标准

‘ ’确实是被 ‘+’替代,他使用的编码标准为RFC-1738。

HTML4.01标准对于空格编码的说明
HTML4.01标准对于空格编码的说明

而JS使用的将‘ ’ 转义为%20的编码标准为RFC-2396标准。

代码语言:javascript
复制
Encodes characters in the given string as'%'-escaped octets using the UTF-8 scheme. Leaves letters ("A-Z","a-z"), numbers ("0-9"), and unreserved characters("_-!.~'()*") intact. Encodes all other characters.

总结:

###在HTML4.0.1中,基于RFC-1738标准,‘ ’在URL编码以后为 ‘+’,只有JS中由于基于RFC-2396标准,‘ ’在URL编码以后为‘%20’。

最后推荐一个MSDK开发使用的encode函数:

代码语言:javascript
复制
/**
 * URL encode推荐方法
 * @param value
 * @return
 */
public static String encode(String value) {
	String encoded = "";
	try {
		encoded = URLEncoder.encode(value, "UTF-8");
	} catch (UnsupportedEncodingException ignore) {
	}
	StringBuffer buf = new StringBuffer(encoded.length());
	char focus;
	for (int i = 0; i < encoded.length(); i++) {
		focus = encoded.charAt(i);
		if (focus == '*') {
			buf.append("%2A");
		} else if (focus == '+') {
			buf.append("%20");
		} else if (focus == '%' && (i + 1) < encoded.length()
				&& encoded.charAt(i + 1) == '7'
				&& encoded.charAt(i + 2) == 'E') {
			buf.append('~');
			i += 2;
		} else {
			buf.append(focus);
		}
	}
	return buf.toString();
	
}
上述代码地址:https://github.com/bihe0832/MyDemo/tree/master/Common
博客中代码地址:https://github.com/bihe0832/MyDemo/tree/master/UrlDemo
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2014年07月22日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 总结:在HTML4.0.1中,基于RFC-1738标准,‘ ’在URL编码以后为 ‘+’,只有JS中由于基于RFC-2396标准,‘ ’在URL编码以后为‘%20’。
  • java代码:
  • PHP代码
    • 怒而翻身回去google一把,在W3C找到HTML标准,根据HTML4.01标准,
      • 而JS使用的将‘ ’ 转义为%20的编码标准为RFC-2396标准。
        • 上述代码地址:https://github.com/bihe0832/MyDemo/tree/master/Common
        • 博客中代码地址:https://github.com/bihe0832/MyDemo/tree/master/UrlDemo
    • 总结:
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档