AF 似乎会对 GET 参数进行两次编码一次是 url encode,另外一个是什么?

2014-12-12 17:01:39 +08:00
 dopcn
还是我使用的时候有问题?
中文参数变成这样了
仅仅 url encode 应该没有这么些25
%25E7%25B1%25BB%25E9%25A3%258E%25E6%25B9%25BF
3913 次点击
所在节点    iDev
23 条回复
jox
2014-12-12 17:14:33 +08:00
。。。。。

先url encoding,然后还得进行utf-8 encoding吧。。。。。
satanwoo
2014-12-12 19:38:42 +08:00
@jox url encode 不就是选择uft8或者gbk或者被的编码方式对字符进行编码嘛?
jox
2014-12-12 19:41:51 +08:00
@satanwoo 。。。。。。。。url encode是url encode,utf 8和gbk是另外的编码,完完全全是没有任何关系的两码事
juicy
2014-12-12 19:45:29 +08:00
另外一次还是url encode...
satanwoo
2014-12-12 20:08:18 +08:00
@jox 那url encode 是干啥的?
jox
2014-12-12 20:18:23 +08:00
@satanwoo 不会自己看资料啊?

uri里有一些字符是保留字符,uri里如果要用到保留字符集里的字符,就要将这些字符编码,这样就告诉uri的使用者这些字符的用途不是保留字符的含义,非保留字符集里的字符不需要使用百分号前缀进行编码,应该直接使用,其他字符按照标准需要将其转换成utf 8编码,然后再使用百分号前缀,只要不是保留字符集或者非保留字符集里的字符,也可以使用其他编码方式进行编码,只要uri的使用者知道uri的编码方式就能够解码。
satanwoo
2014-12-12 20:19:39 +08:00
@jox 是啊,整个步骤叫url encode。
thedevil5032
2014-12-12 20:21:04 +08:00
satanwoo
2014-12-12 20:22:08 +08:00
@thedevil5032 这个对我的问题不适用,你可能理解我的回答。
jox
2014-12-12 20:23:15 +08:00
@satanwoo 但是url encoding并不是

“选择uft8或者gbk或者被的编码方式对字符进行编码”

你这么说是错误的

另外lz的这个字符串看上去是经过了两次url escape,我没用过AF,为什么要这么做?
satanwoo
2014-12-12 20:26:02 +08:00
@jox 我的回答的意思是,url encode中就是有这一步选择uft8或者gbk或者被(别)的编码方式对字符进行编码,这不能单独视为两次编码吧。

我猜和CFURLCreateStringByAddingPercentEscapes中遇到的特例有关。
satanwoo
2014-12-12 20:33:04 +08:00
@jox 它这个%25感觉就是&这个玩意吧,感觉是一个get请求,带了大量的参数。
jox
2014-12-12 21:15:51 +08:00
@satanwoo 根据这个:

http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.1

一般提到url encode的时候要把空格替换成'+',需要特殊对待,非保留字符直接使用,其他所有字节都使用%HH的格式进行编码,这里是对字节进行utf 8编码,而不是对字符进行utf 8编码,这跟你说的“对字符进行编码”完全是两码事

如果在使用obj c进行编程的时候,字符串一般都是用NSString来保存的,要想将字符串通过HTTP使用form形式传到别的电脑的话,需要先将字符串进行url encoding,将所有的空格替换成'+',其余字节如果不是非保留字符还要按照%HH的格式编码,最后还要使用NSString的dataUsingEncoding转换成NSData类型,在我看来这就是两步编码,只不过第二步里因为经过第一步的url encoding,经过utf 8 encoding之后数据的内容没有发生变化,但编码还是发生了,'a' -- utf- 8 encoding --> 'a'。
jox
2014-12-12 21:23:41 +08:00
@satanwoo 如果是经过url encoding的话,%25对应的字符是'%',数据 %E7%B1%BB 经过url encoding的话正好是 %25E7%25B1%25BB

但是为什么要这么做?什么情况下需要对数据进行两次url encoding呢???
dopcn
2014-12-13 14:56:22 +08:00
@juicy 这位兄台说对了……
dopcn
2014-12-13 14:58:04 +08:00
@jox AF 自己会进行 encode 自己传参数的时候又 encode 了一次……
dopcn
2014-12-13 15:00:47 +08:00
@jox 但是就像 @satanwoo 所说,我现在理解 URL encode 是以 utf-8 格式进行,不存在另外的 utf-8 encode 应该是指 URL encode 的一种
jox
2014-12-13 15:48:59 +08:00
@dopcn url encode不用utf 8来编码字符,url encode只是将字符串里的除保留字符和非保留字符以外的其他字符的byte转化成%HH的格式,HH是该byte的utf-8码,很容易得到的一个例子:空格的utf 8码U+0020,但是百分号转换,即url encoding,之后是'+',字符串“a b c”经过url encoding之后是"a+b+c",二进制数据是十六进制码“0061002B0062002B0063”,使用utf 8编码之后的二进制数据是十六进制码"00610020006200200063",这是完全不同的,如果是中文经过url encoding之后区别就更大了,因为多了个%,你把一个字符串经过url encoding之后再使用utf 8来解码将得不到原来的字符串。

satanwoo 的说法是错误的
jsq2627
2014-12-13 16:55:55 +08:00
@dopcn URL Encode 仅仅是指把数据用%HH形式表示成ASCII字符串的过程。至于数据到底是什么编码,URL Encode 不关注。
事实上在浏览器里,提交表单的时候,到底是用哪种编码进行 URL Encode 是要看网页的 charset 的。如果 charset 是 GBK,浏览器会用 GBK 编码后的数据进行 URL Encode。
http://www.w3schools.com/tags/ref_urlencode.asp
jox
2014-12-13 17:54:44 +08:00
@jsq2627 空格会被替换成+,+和非保留字符是不会使用%HH格式来编码的。非保留字符集包括:

. - _ ~ a-z A-Z 0-9

另外w3schools.com这个网站并不是w3c官方的网站,虽然上面的资料很有用,但是有些资料是有误的,还是得看w3c上面的规格以及RFC,嘛,不过w3c感觉就是在打酱油,最终还是各大厂商在主导。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/153469

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX