AF 似乎会对 GET 参数进行两次编码一次是 url encode,另外一个是什么? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iOS 开发实用技术导航
NSHipster 中文版
http://nshipster.cn/
cocos2d 开源 2D 游戏引擎
http://www.cocos2d-iphone.org/
CocoaPods
http://cocoapods.org/
Google Analytics for Mobile 统计解决方案
http://code.google.com/mobile/analytics/
WWDC
https://developer.apple.com/wwdc/
Design Guides and Resources
https://developer.apple.com/design/
Transcripts of WWDC sessions
http://asciiwwdc.com
Cocoa with Love
http://cocoawithlove.com/
Cocoa Dev Central
http://cocoadevcentral.com/
NSHipster
http://nshipster.com/
Style Guides
Google Objective-C Style Guide
NYTimes Objective-C Style Guide
Useful Tools and Services
Charles Web Debugging Proxy
Smore
dopcn
V2EX    iDev

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

  •  
  •   dopcn
    dopcn 2014-12-12 17:01:39 +08:00 4150 次点击
    这是一个创建于 3958 天前的主题,其中的信息可能已经有所发展或是发生改变。
    还是我使用的时候有问题?
    中文参数变成这样了
    仅仅 url encode 应该没有这么些25
    %25E7%25B1%25BB%25E9%25A3%258E%25E6%25B9%25BF
    23 条回复    2014-12-15 01:15:56 +08:00
    jox
        1
    jox  
       2014-12-12 17:14:33 +08:00
    。。。。。

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

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

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

    你这么说是错误的

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

    我猜和CFURLCreateStringByAddingPercentEscapes中遇到的特例有关。
    satanwoo
        12
    satanwoo  
       2014-12-12 20:33:04 +08:00
    @jox 它这个%25感觉就是&这个玩意吧,感觉是一个get请求,带了大量的参数。
    jox
        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'。
    jox
        14
    jox  
       2014-12-12 21:23:41 +08:00
    @satanwoo 如果是经过url encoding的话,%25对应的字符是'%',数据 %E7%B1%BB 经过url encoding的话正好是 %25E7%25B1%25BB

    但是为什么要这么做?什么情况下需要对数据进行两次url encoding呢???
    dopcn
        15
    dopcn  
    OP
       2014-12-13 14:56:22 +08:00
    @juicy 这位兄台说对了……
    dopcn
        16
    dopcn  
    OP
       2014-12-13 14:58:04 +08:00
    @jox AF 自己会进行 encode 自己传参数的时候又 encode 了一次……
    dopcn
        17
    dopcn  
    OP
       2014-12-13 15:00:47 +08:00
    @jox 但是就像 @satanwoo 所说,我现在理解 URL encode 是以 utf-8 格式进行,不存在另外的 utf-8 encode 应该是指 URL encode 的一种
    jox
        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 的说法是错误的
    jsq2627
        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
    jox
        20
    jox  
       2014-12-13 17:54:44 +08:00
    @jsq2627 空格会被替换成+,+和非保留字符是不会使用%HH格式来编码的。非保留字符集包括:

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

    另外w3schools.com这个网站并不是w3c官方的网站,虽然上面的资料很有用,但是有些资料是有误的,还是得看w3c上面的规格以及RFC,嘛,不过w3c感觉就是在打酱油,最终还是各大厂商在主导。
    satanwoo
        21
    satanwoo  
       2014-12-15 00:08:18 +08:00
    @jox 能别瞎说吗?我什么时候说url是选择utf-8进行编码?
    我再复制次我表达的意思:url encode中就是有这一步选择uft8或者gbk或者被(别)的编码方式对字符进行编码,这不能单独视为两次编码吧。
    satanwoo
        22
    satanwoo  
       2014-12-15 00:10:56 +08:00
    @jox 你也别回复我了,你爱咋理解咋理解。
    jox
        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的差别。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5592 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 05:56 PVG 13:56 LAX 22:56 JFK 01:56
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86