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 · 3884 次点击
    这是一个创建于 3633 天前的主题,其中的信息可能已经有所发展或是发生改变。
    还是我使用的时候有问题?
    中文参数变成这样了
    仅仅 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   ·   实用小工具   ·   933 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 20:35 · PVG 04:35 · LAX 12:35 · JFK 15:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.