Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/116.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 编码URL包含特殊字符_Ios_Objective C_Special Characters_Encode_Nsurl - Fatal编程技术网

Ios 编码URL包含特殊字符

Ios 编码URL包含特殊字符,ios,objective-c,special-characters,encode,nsurl,Ios,Objective C,Special Characters,Encode,Nsurl,我有一个包含特殊字符的URL(%经常使用)。。我想编码的网址,如何? 这是我的URL的一个示例: 我尝试了以下方法: // Option - 1. NSString* str = [self.shareURL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; // Option - 2. NSString *unsafeString = @"this &string= confuses ? the

我有一个包含特殊字符的URL(%经常使用)。。我想编码的网址,如何? 这是我的URL的一个示例:

我尝试了以下方法:

//  Option - 1.

NSString* str = [self.shareURL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

//  Option - 2. 

NSString *unsafeString = @"this &string= confuses ? the InTeRwEbZ";
CFStringRef safeString = CFURLCreateStringByAddingPercentEscapes (
    NULL,
    (CFStringRef)unsafeString,
    NULL,
    CFSTR("/%&=?$#+-~@<>|\\*,.()[]{}^!"),
    kCFStringEncodingUTF8
);

//  Option - 3.

NSString *escapedString = [unescaped stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLHostAllowedCharacterSet]]; 
//选项-1。
NSString*str=[self.shareURL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
//备选方案2。
NSString*unsafeString=@“this&string=混淆了InTeRwEbZ”;
CFStringRef safeString=cfurlCreateStringByAddingPercents转义(
无效的
(CFStringRef)不安全,
无效的
CFSTR(“/%&=?$\+-~@\\*,.()[]{}^!”),
kCFStringEncodingUTF8
);
//备选方案-3。
NSString*escapedString=[unescaped stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLHostAllowedCharacterSet]];
正如您所说,是一个错误的URL。你应该有什么好的URL


为什么会有//after.com?

按顺序处理您的三种变体:

  • 使用
    stringbyaddingpercentescapesusingencode
    非常方便,可以解决URL中包含
    %
    的问题

    然而,这种方法非常有限,不能解决许多常见的问题。例如,如果您好奇的URL路径字符串中有一个
    ?此方法将使问号不被替换(因为问号在URL中作为分隔请求开始参数的一种方式是有效的),如果您确实需要
    作为该路径的一部分,则在这种情况下,这将是一个问题

    在实践中,虽然人们喜欢通过添加百分比escapesusingencode作为对百分比逃避问题的回答来建议
    string,但它总是无法提供足够的控制来充分完成这项工作

  • >P>这导致我们进入代码> CFURLCreateStringByAddingPercentEscapes < /Cord>,这是提供更高级别控制的核心基础函数。在iOS 7之前,这是一种“转到”解决方案,允许您限定可能要额外转义的“合法字符”(例如,
    )。您还可以指定哪些通常转义的字符可能希望不转义

    关于此函数示例的三个观察结果:

    • 您已经指定了一大组要转义的字符,包括一些本来应该转义的字符。包含这些额外的字符并没有什么坏处,但表明对这个函数的作用有一点误解

    • 同样,您正在转义一些不需要转义的字符(
      -
      ~

    • 最后,当我们在Objective-C代码中使用此函数时,通常会将其作为
      NSString
      返回,并使用
      CfBridgegRelease
      \uBridge\uTransfer
      转移所有权。这使我们不必处理核心基础类型,而必须手工编写代码> cFrRelys<代码>。p>
    无论如何,这会产生如下结果:

    - (NSString *)percentEscapeString:(NSString *)string
    {
        return CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
                                                                         (CFStringRef)string,
                                                                         NULL,
                                                                         (CFStringRef)@":/?@!$&'()*+,;=",
                                                                         kCFStringEncodingUTF8));
    }
    
    顺便说一下,如果您执行这种百分比转义例程,请在URL的各个组件上执行(例如,仅在名称中带有“50%”的路径部分),而不是整个URL。URL中有一些字符是有效的(例如,
    /
    ),但在此路径中无效,因此您希望对路径中的这些字符进行百分比转义,而不是对整个URL进行转义

  • 这将导致我们通过添加带有允许字符的百分比编码来获得
    string。在IOS 7中引入的这种方法提供了与上述核心基础函数相同的控制级别,但没有桥接的麻烦。只要选择合适的字符集,它就会从那里开始


  • 是的,你是对的,我不知道我以前怎么没有想到这一点,坦克斯