在ios开发中,涉及网络部分的时候,需要写一些url,url中不能避免的会出现中文,出现中文的时候,如果不做处理,就会出现错误。解决这个的问题办法就是对url进行URLencoding,原因和解决方法如下。

原因:

。这是因为网络标准RFC1738做了硬性规定:

     这意味着,如果URL中有汉字,就必须编码后使用。但是麻烦的是,RFC 1738没有规定具体的编码方法,而是交给应用程序(浏览器)自己决定。这导致“URL编码”成为了一个混乱的领域。

实验:

  1. 当汉字处在url中的路径中———UTF-8

查看HTTP请求的头信息,会发现IE实际查询的网址是“http://zh.wikipedia.org/wiki/春节 ”。 也就是说,IE自动将“春节”编码成了“春节”。

我们知道,“春”和“节”的utf-8编码分别是“E6 98 A5”和“E8 8A 82”,因此,“春节”就是按照顺序,在每个字节前加上%而得到的。

在Firefox中测试,也得到了同样的结果。

所以,结论1就是,网址路径的编码,用的是utf-8编码。

2. 查询字符串包含汉字

切换到十六进制方式,才能清楚地看到,“春节”被转成了“B4 BA BD DA”。

我们知道,“春”和“节”的GB2312编码(我的操作系统“Windows XP”中文版的默认编码)分别是“B4 BA”和“BD DA”。因此,IE实际上就是将查询字符串,以GB2312编码的格式发送出去。

Firefox的处理方法,略有不同。它发送的HTTP Head是“wd=����”。也就是说,同样采用GB2312编码,但是在每个字节前加上了%。

所以结论2就是,查询字符串的编码,用的是操作系统的默认编码。

3. Get方法生成的URL包含汉字

前面说的是直接输入网址的情况,但是更常见的情况是,在已打开的网页上,直接用Get或Post方法发出HTTP请求。

这时的编码方法由网页的编码决定,也就是由HTML源码中字符集的设定决定。

解决办法:

NSString 
   * body = [[ 
   NSString 
    alloc 
   ] 
    initWithFormat 
   : 
   @"access_token=%@&comment=%@&id=%@" 
   , 
   _access_token 
   , 
   _commentText 
   . 
   text 
   , 
   _Tid 
   ];

其中comment是可能包含中文的。

NSString 
   *encodingString = ( 
   NSString 
   *) 
   CFBridgingRelease 
   ( 
   CFURLCreateStringByAddingPercentEscapes 
   ( 
   kCFAllocatorDefault 
   , ( 
   CFStringRef 
   ) body, ( 
   CFStringRef 
   ) 
    @"&%" 
   , 
    nil 
   , 
   kCFStringEncodingUTF8 
   ));