iOS中文网址路径转换URLEncode

今天发现一个蛋疼的问题,服务端返回的urlString里面有时含有中文,使用

[NSURL URLWithString:urlString]生成URL对象时,iOS客户端不能正确进行网络请求,网上找到的URLEncode方法又不能完全解决问题.

方法1:

NSString* encodedString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

方法2:

NSString * encodedString = (NSString *)CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,(CFStringRef)urlString,NULL,NULL,kCFStringEncodingUTF8);

这两种方法当urlString里含有中文时URL编码是正确的,但是如果其中含有已转义的%等符号时,又会再次转义而导致错误.

查看方法2参数说明:

CFStringRef CFURLCreateStringByAddingPercentEscapes(CFAllocatorRef allocator, CFStringRef originalString, CFStringRef charactersToLeaveUnescaped, CFStringRef legalURLCharactersToBeEscaped, CFStringEncoding encoding);

因此做出修改,写出方法:

NSString *encodedString = (NSString *)

CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,

                                        (CFStringRef)urlString,

                                        (CFStringRef)@"!$&‘()*+,-./:;[email protected]_~%#[]",

                                        NULL,

                                        kCFStringEncodingUTF8);

如果在所有的类里都要用到这个方法,可以写成category,然后在头文件import "NSString+URL.h" 即可调用.

@interface NSString (URL)
- (NSString *)URLEncodedString;
@end  
#import "NSString+URL.h"  

@implementation NSString (URL)  

- (NSString *)URLEncodedString
{
    NSString *encodedString = (NSString *)
    CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
                                            (CFStringRef)self,
                                            (CFStringRef)@"!$&‘()*+,-./:;[email protected]_~%#[]",
                                            NULL,
                                            kCFStringEncodingUTF8);
    return encodedString;
}
@end  

 

调用方法:

NSString *encodedString = [urlString URLEncodedString];

//encodedString do something

时间: 2025-01-11 15:38:36

iOS中文网址路径转换URLEncode的相关文章

python3 网址路径中带中文的处理办法

由于python目前不能直接处理中文路径,必须要转化一下,如下例子是下载图片(名字为中文的): def getInfo(self,imageurl):        response = urllib.request.urlopen(imageurl).read().decode('utf-8')#         with open("text1.txt",'w',encoding='utf-8') as file:#             file.write(response)

物理路径,虚拟路径,物理路径与虚拟路径转换,文件下载方法

1 什么是物理路径?什么是虚拟路径?(1) 例子:  用IIS举个例子:     WEB服务目录是d:\路径     那么用HTTP访问网站根目录的时候,其实访问的是d:\路径,那么其中虚拟路径就是\(根),物理路径就是d:\路径  (2) 我自己的理解:绝对路径一般都是带有磁盘完成路径, 而虚拟路径一般不带有磁盘 2 程序中虚拟路径和物理路径的转化 #region 物理路径和相对路径的转换        //本地路径转换成URL相对路径          private string urlc

解决IE、360、谷歌浏览器等无法访问FTP中文文件路径

最近开发一个项目,用户的文件是存放在FTP服务器上的.并且需要在浏览器中,浏览这些文件.FTP文件路径如下: 但是却出现了如下问题:ftp://192.168.1.121/成果/分区/建设控制/市域控规划分.jpg 1.FTP中文文件路径在Firfox中可以正常显示 2.但是在IE.360.谷歌浏览其中却提示,无法访问路径 经过查询资料,知道IE等浏览器对中文字符采用的是GBK的字符集编码,但是Firfox却是采用的UTF-8的字符集编码. 所以得出如下结论: 1.在客户端判断浏览器产品是否属于

IOS --- 日期时间格式 转换

1.如何如何将一个字符串如" 20110826134106"装化为任意的日期时间格式,下面列举两种类型: NSString* string [email protected]"20110826134106"; NSDateFormatter*inputFormatter = [[[NSDateFormatter alloc] init]autorelease]; [inputFormattersetLocale:[[[NSLocale alloc] initWith

android Uri获取真实路径转换成File的方法

Uri uri = data.getData(); String[] proj = { MediaStore.Images.Media.DATA }; Cursor actualimagecursor = managedQuery(uri,proj,null,null,null); int actual_image_column_index = actualimagecursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); actua

iOS的相对路径和绝对路径

iOS程序有固定的文件访问限制,只能在自己的沙盒内. UIImage *img=[UIImage imageNamed:@"cellicon.png"]; 这段代码从相对路径加载了一个png图片资源作为UIImage对象,没有任何问题.因为它在内部已经偷偷得帮你把路径转化为相对路径了,你还不知道吧! 接下来,如果要加载一些自定义格式的文件或者数据,就会出现相对路径和绝对路径的问题.比如 NSFileHandle *fileHandle=[NSFileHandlefileHandleFo

IOS中文字体斜体效果

/* 该代码用于解决在IOS开发,中文字体不能使用斜体的问题 对该控件进行旋转,因此如果控件有背景颜色/图片,也会跟着旋转 可将该控件设置背景透明,于Label下方再建一个有背景颜色的Frame相同的Label */ UILabel *lbl = [[UILabel alloc] initWithFrame:CGRectMake(100, 100, 200, 40)]; lbl.backgroundColor = [UIColor clearColor]; lbl.text = @"中文斜体&q

用python做采集时相对路径转换成绝对路径

采集时,有时候需要采集图片,但某些网站的图片提供的相对地址,最好转换成绝对地址 在scrapy中有如下的解决策略 http://stackoverflow.com/questions/6499603/python-scrapy-convert-relative-paths-to-absolute-paths http://stackoverflow.com/questions/19970015/scrapy-item-loader-to-get-a-absolute-url-from-extra

读取IOS的相应路径

//    IOS相应路径 NSString* bundlePath = [[NSBundle mainBundle] bundlePath]; NSLog(@"bundlePath = %@", bundlePath); //    documents NSString* documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory, NSUserDomainMask, YES)