1
jox 2014-12-12 17:14:33 +08:00
。。。。。
先url encoding,然后还得进行utf-8 encoding吧。。。。。 |
3
jox 2014-12-12 19:41:51 +08:00
@satanwoo 。。。。。。。。url encode是url encode,utf 8和gbk是另外的编码,完完全全是没有任何关系的两码事
|
4
juicy 2014-12-12 19:45:29 +08:00
另外一次还是url encode...
|
6
jox 2014-12-12 20:18:23 +08:00
@satanwoo 不会自己看资料啊?
uri里有一些字符是保留字符,uri里如果要用到保留字符集里的字符,就要将这些字符编码,这样就告诉uri的使用者这些字符的用途不是保留字符的含义,非保留字符集里的字符不需要使用百分号前缀进行编码,应该直接使用,其他字符按照标准需要将其转换成utf 8编码,然后再使用百分号前缀,只要不是保留字符集或者非保留字符集里的字符,也可以使用其他编码方式进行编码,只要uri的使用者知道uri的编码方式就能够解码。 |
8
thedevil5032 2014-12-12 20:21:04 +08:00
|
9
satanwoo 2014-12-12 20:22:08 +08:00
@thedevil5032 这个对我的问题不适用,你可能理解我的回答。
|
10
jox 2014-12-12 20:23:15 +08:00
@satanwoo 但是url encoding并不是
“选择uft8或者gbk或者被的编码方式对字符进行编码” 你这么说是错误的 另外lz的这个字符串看上去是经过了两次url escape,我没用过AF,为什么要这么做? |
11
satanwoo 2014-12-12 20:26:02 +08:00
@jox 我的回答的意思是,url encode中就是有这一步选择uft8或者gbk或者被(别)的编码方式对字符进行编码,这不能单独视为两次编码吧。
我猜和CFURLCreateStringByAddingPercentEscapes中遇到的特例有关。 |
13
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'。 |
14
jox 2014-12-12 21:23:41 +08:00
@satanwoo 如果是经过url encoding的话,%25对应的字符是'%',数据 %E7%B1%BB 经过url encoding的话正好是 %25E7%25B1%25BB
但是为什么要这么做?什么情况下需要对数据进行两次url encoding呢??? |
17
dopcn OP |
18
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 的说法是错误的 |
19
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 |
20
jox 2014-12-13 17:54:44 +08:00
@jsq2627 空格会被替换成+,+和非保留字符是不会使用%HH格式来编码的。非保留字符集包括:
. - _ ~ a-z A-Z 0-9 另外w3schools.com这个网站并不是w3c官方的网站,虽然上面的资料很有用,但是有些资料是有误的,还是得看w3c上面的规格以及RFC,嘛,不过w3c感觉就是在打酱油,最终还是各大厂商在主导。 |
21
satanwoo 2014-12-15 00:08:18 +08:00
@jox 能别瞎说吗?我什么时候说url是选择utf-8进行编码?
我再复制次我表达的意思:url encode中就是有这一步选择uft8或者gbk或者被(别)的编码方式对字符进行编码,这不能单独视为两次编码吧。 |
23
jox 2014-12-15 01:15:56 +08:00
@satanwoo ?
url encoding 并不 - 选择utf 8或者被(别)的编码方式对“字符”进行编码 - 这是错误的。url encoding真正在做的是将使用某种编码的byte序列进行百分号转换,这是wiki上的资料: The generic URI syntax mandates that new URI schemes that provide for the representation of character data in a URI must, in effect, represent characters from the unreserved set without translation, and should convert all other characters to bytes according to UTF-8, and then percent-encode those values. 如果你需要传送utf 8编码的数据,在百分换转换之前byte序列如果已经是utf 8编码,只需要按照url encoding的规则做一次百分换转换就可以了,但如果在百分号转换之前不是utf 8序列你是不是要先转换成utf 8序列? url encoding的规则对应的单元是一个byte,并不是一个字符,一个字符的长度可以是一byte,但是一byte不一定就是一个字符,一个utf 8字符最长可以达到6 bytes,url encoding的规则里没有任何一个规则是用来对字符进行编码的,我觉得你似乎没搞清楚字符和byte的差别。 |