2009-11-03 85 views
9

他们的方法来编码/解码HTML和URL(在Xcode中,使用Objective-C)?URL编码和HTML编码NSStrings

[NSString stringWithContentsOfFile:<#(NSString *)path#> encoding:<#(NSStringEncoding)enc#> error:<#(NSError **)error#>] 

这似乎并没有工作如何我的预期。我认为它会将“<”等特殊字符转换为等效的HTML实体,即在这种情况下为“<”。

下面是与此相关的主题(一般)的w3school链接的引用:

HTML URL Encoding Reference

HTML Entities Reference

在预期感谢。

回答

19

返回使用给定编码的接收方表示,以确定将接收方转换为合法URL字符串所需的百分比转义。

- (NSString *)stringByAddingPercentEscapesUsingEncoding:(NSStringEncoding)encoding 

返回通过接收器的所有百分比与由给定的编码所确定的匹配字符逸出替换作出了新的字符串。

- (NSString *)stringByReplacingPercentEscapesUsingEncoding:(NSStringEncoding)encoding 
+1

阅读其他答案的方法来引用字符串作为XML(即,实体替换和<<) – 2012-03-19 09:31:29

11

你举的方法,从磁盘读取一个文件具有给定字符编码(例如UTF-8或ASCII)。它与URL或HTML转义无关。

如果你想添加URL百分号转义,想要此方法:

[myString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding] 

请务必阅读有关该方法的文档,因为有什么泄漏出来并独自留下什么一定的微妙之处。在某些情况下,您可能不得不使用更复杂但更灵活的CFURLCreateStringByAddingPercentEscapes()。 (如果你这样做,请注意,你可以投CFStringRefNSString *,反之亦然。)

没有什么内置的,我知道做XML/HTML风格的实体转义,不过这个功能应该处理的基础知识:

NSString * convertToXMLEntities(NSString * myString) { 
    NSMutableString * temp = [myString mutableCopy]; 

    [temp replaceOccurrencesOfString:@"&" 
          withString:@"&amp;" 
          options:0 
           range:NSMakeRange(0, [temp length])]; 
    [temp replaceOccurrencesOfString:@"<" 
          withString:@"&lt;" 
          options:0 
           range:NSMakeRange(0, [temp length])]; 
    [temp replaceOccurrencesOfString:@">" 
          withString:@"&gt;" 
          options:0 
           range:NSMakeRange(0, [temp length])]; 
    [temp replaceOccurrencesOfString:@"\"" 
          withString:@"&quot;" 
          options:0 
           range:NSMakeRange(0, [temp length])]; 
    [temp replaceOccurrencesOfString:@"'" 
          withString:@"&apos;" 
          options:0 
           range:NSMakeRange(0, [temp length])]; 

    return [temp autorelease]; 
} 
+8

哇,你的代码看起来像一个正式的法国花园。 – 2009-11-03 16:11:41

+1

如果我是为自己的代码编写的,我实际上已经在NSMutableString的类别中定义了-replaceOccurrencesOfString:withString:方法,并用它来避免重复。 (我可能已经把它写成了一个NSMutableString方法,而不是一个函数,可以想到它。)但是我不想在这方面包含太多内容。 – 2009-11-03 23:05:22

+0

查看CocoaFu的回答。它是正确的。 – 2011-02-09 08:24:44

3

要做到HTML/XML实体编码,你可以使用一个CFMutableString功能:

NSString *result = .....;
CFStringTransform((CFMutableStringRef)result, NULL, kCFStringTransformToXMLHex, false);

通过CFStringTransform的最后一个参数设置为true,它应该工作进行解码(十六进制)实体。

3

使用CFStringTransform为HTML实体编码/解码:

CFStringTransform((CFTypeRef)yourMutableString, NULL, CFSTR("Any-Hex/XML"), FALSE);

您需要使用ICU转换 “任何环己烷/ XML”。 kCFStringTransformToXMLHex不够积极。

+0

kCFStringTransformToXMLHex错过了什么样的实体? – 2012-03-19 09:27:02

+1

@StevenKramer例如,>或者&。 – fzwo 2013-01-22 11:57:28