iOS URL带特殊字符(汉字、空格等)导致图片加载失败

部分特殊字符编码

在加载网络图片(特别是使用SDWebImage加载图片)时,我们经常会遇到图片缓存失败的情况,打印url后我们会发现 字符串中总会有一些不合法的字符(汉字、空格等).
所以加载图片时要考虑到url处理的问题.
通常情况下,新建一个NSURL的分类重载+ (void)load方法,采用runtime动态交换方法是最常用的选择.

+ (void)load {
   // 获取URLWithString:方法的地址
   Method URLWithStringMethod = class_getClassMethod(self, @selector(URLWithString:));
   // 获取BMW_URLWithString:方法的地址
   Method BMW_URLWithStringMethod = class_getClassMethod(self, @selector(BMW_URLWithString:));
   // 交换方法地址
   method_exchangeImplementations(URLWithStringMethod, BMW_URLWithStringMethod);
   
}
+ (NSURL *)BMW_URLWithString:(NSString *)URLString {
   NSString *newURLString = [self isChinese:URLString];
   return [NSURL BMW_URLWithString:newURLString];
}
//处理特殊字符
+ (NSString *)isChinese:(NSString *)str {
   NSString *newString = str;
   //遍历字符串中的字符
   for(int i=0; i< [str length];i++){
       int a = [str characterAtIndex:i];
       //汉字的处理
       if( a > 0x4e00 && a < 0x9fff)
       {
           NSString *oldString = [str substringWithRange:NSMakeRange(i, 1)];
           NSString *string = [oldString stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
           newString = [newString stringByReplacingOccurrencesOfString:oldString withString:string];
       }
       //空格处理
       if ([newString containsString:@" "]) {
           newString = [newString stringByReplacingOccurrencesOfString:@" " withString:@"%20"];

       }
     //如果需要处理其它特殊字符,在这里继续判断处理即可.
   }
   return newString;
}

实现以上方法后 调用URLWithString加载数据时,会自动处理汉字和空格,如果需要处理其它特殊字符,只需要在方法后面加上判断继续处理就行了.

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,903评论 1 32
  • iOS开发系列--网络开发 概览 大部分应用程序都或多或少会牵扯到网络开发,例如说新浪微博、微信等,这些应用本身可...
    lichengjin阅读 9,243评论 2 7
  • 前言 最先接触编程的知识是在大学里面,大学里面学了一些基础的知识,c语言,java语言,单片机的汇编语言等;大学毕...
    oceanfive阅读 8,485评论 0 7
  • ## iOS常用问题总结#### iOS基础知识回顾##### 1、为什么说Objective-C是一门动态的语言...
    蝉始鸣阅读 3,342评论 0 3
  • iOS网络编程读书笔记 Facade Tester客户端门面模式的实例(被动版本化) 被动版本化,所以硬编码URL...
    melouverrr阅读 5,547评论 3 7

友情链接更多精彩内容