如果返回的URL中有中文可以用此方法转换

今天发现一个蛋疼的问题,服务端返回的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)@"!$&'()*+,-./:;=?@_~%#[]",

NULL,

kCFStringEncodingUTF8);

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

NSString+URL.h  文件

  1. @interface NSString (URL)
  2. - (NSString *)URLEncodedString;
  3. @end

NSString+URL.m  文件

  1. #import "NSString+URL.h"
  2. @implementation NSString (URL)
  3. - (NSString *)URLEncodedString
  4. {
  5. NSString *encodedString = (NSString *)
  6. CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
  7. (CFStringRef)self,
  8. (CFStringRef)@"!$&'()*+,-./:;=?@_~%#[]",
  9. NULL,
  10. kCFStringEncodingUTF8);
  11. return encodedString;
  12. }
  13. @end

调用方法:

NSString *encodedString = [urlString
URLEncodedString];

//encodedString do something

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

  1. 代码实现PHP web服务器下绝对路径到Web网址的转换

    代码实现PHP web服务器下绝对路径到Web网址的转换 代码中用到几个系统变量或常量: 1. 路径中各目录分隔字符 DIRECTORY_SEPARATOR(常量),Windows下DIRECTORY ...

  2. paip.解决中文url路径的问题图片文件不能显示

    paip.解决中文url路径的问题图片文件不能显示 #现状..中文url路径 图片文件不能显示 <img src="img/QQ截图20140401175433.jpg" w ...

  3. Nginx 使用中文URL,中文目录路径

    Nginx 使用中文URL,中文目录路径 分类: linux2012-05-03 11:04 2672人阅读 评论(0) 收藏 举报 nginxurl服务器translationcentosserve ...

  4. ios github网址

    ios github网址 http://github.ibireme.com/github/list/ios/

  5. ios沙盒路径

    http://www.cnblogs.com/ios-wmm/p/3299695.html iOS沙盒路径的查看和使用 NSString *path = NSHomeDirectory();//主目录 ...

  6. ios 把毫秒值转换成日期 NSDate

    ios 把毫秒值转换成日期 (比较好用) 1343359790000 这是毫秒值------最佳解决方案-------------------- long long time=134335979000 ...

  7. Java中windows路径转换成linux路径等工具类

    项目中发现别人写好的操作系统相关的工具类: 我总结的类似相关博客:http://www.cnblogs.com/DreamDrive/p/4289860.html import java.net.In ...

  8. iOS: 获取文件路径

    iOS: 获取文件路径   // 例如 - (NSString *)applicationDocumentsDirectory { return [NSSearchPathForDirectories ...

  9. html5中将图片的绝对路径转换成文件对象

    html5中将图片的绝对路径转换成文件对象 将图片的绝对路径转换成base64编码,请看这篇文章 我们先来理解基本知识点: 1. 理解HTML5中的FileList对象与file对象. 在HTML5中 ...

随机推荐

  1. MySQL新建用户,授权,删除用户,修改密码

    首先要声明一下:一般情况下,修改MySQL密码,授权,是需要有mysql里的root权限的.注:本操作是在WIN命令提示符下,phpMyAdmin同样适用.    用户:phplamp  用户数据库: ...

  2. 添加 index_combine hint的索引

    想试验一下 index_combine这个hint,于是做了如下试验. 1.创建一个具有若干index的表 SQL> create table test as select object_id, ...

  3. Boost学习笔记(三) progress_timer

    progress_timer也是一个计时器,它继承自timer,会在析构时自动输出时间,省去timer手动调用elapsed()的工作,是一个用于自动计时相当方便的小工具. #include < ...

  4. 微信,qq,微博如何不用每次清缓存就能看到h5修改过的结果

    描述:每次在对js,和css进行修改,想要在微信,微博或则qq里面预览效果,会发现没有生效,那是因为这些客户端会将静态进行缓存,我们需要清理缓存才能看到修改过的效果,但是每次清理缓存会很麻烦,影响开发 ...

  5. LayoutControl让一个控件占据多行或者多列

    拖动一个layoutcontrol到form上之后,会自动附带一个layoutgroup 设置layoutgroup的layoutmode为table 设置layoutgroup的OptionsTab ...

  6. 彻底卸载Visual Studio 2013、Visual Studio 2015

    彻底卸载 Visual Studio 2013. Visual Studio 2015 以及后续各种版本使用方法0. 解压下载的 TotalUninstaller.zip 文件1. 使用 admini ...

  7. BW顾问必需要清楚的:时间相关数据建模场景需求分析

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  8. DSO的记录模式Record Mode字段测试

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  9. dispatch a action with a timeout

    程序入口文件添加依赖: import { createStore, applyMiddleware } from 'redux' import thunk from 'redux-thunk' // ...

  10. 在ionic/cordova中使用极光推送插件(jpush)

    Stpe1:创建一个项目(此处使用的是tab类型的项目,创建方式可参照我前一篇如何离线创建Ionic1项目) Stpe2:修改项目信息 打开[config.xml]修改下图内容: