2010-02-22 43 views
1

当我获取任何网页的源代码时,无论使用什么编码,我总是以&# - 字符(比如©或®)代替实际字符他们自己。这也适用于外国字符(例如瑞典语中的åäö),我必须从“& Aring”等解析)。iPhone SDK - stringWithContentsOfUrl HTML源代码中的ASCII字符

我使用

+stringWithContentsOfUrl: encoding: error; 

获取来源,并尝试了几种不同的编码如NSUTF8StringEncoding和NSASCIIStringEncoding,但似乎没有影响最终结果的字符串。

任何想法/提示/解决方案非常感谢!我宁愿不必实现整个ASCII表,并替换每个字符的所有发生......在此先感谢!

问候

回答

0

你确定他们原本不是Å形式?尝试先在浏览器中查看源代码。

+0

该网页看起来不错,但我不得不相信有一个比这更好的方法:http://stackoverflow.com/questions/659602/objective-c-html-escape-unescape – user278647 2010-02-22 12:23:51

+0

为了澄清,网页源代码显示&# - 字符,但我希望它们在NSString中具有相同的效果(如在Web浏览器中显示的那样)。 – user278647 2010-02-22 12:27:08

+0

@user:如果它们原本是'Å'形式,并且您想将它们转换为'Å',那么否,没有比这更好的了。 – kennytm 2010-02-22 12:28:03

0

真的,真的很糟糕。我想直接转换它,上面的解决方案并不是很好,所以我只写了自己的ASCII转换器(静态)类。工作原本应该本地工作(虽然我必须自己填写ascii表...)

想法优化? (“ASCII”是一个静态的NSDictionary)

@implementation InternetHelper 

+(NSString *)HTMLSourceFromUrlWithString:(NSString *)str convertASCII:(BOOL)state 
{ 
    NSURL *url = [NSURL URLWithString:str]; 
    NSString *source = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil]; 

    if (state) 
     source = [InternetHelper ConvertASCIICharactersInString:source]; 

    return source; 
} 

+(NSString *)ConvertASCIICharactersInString:(NSString *)str 
{ 
    NSString *ret = [NSString stringWithString:str]; 

    if (!ASCII) 
    { 
     NSString *path = [[NSBundle mainBundle] pathForResource:kASCIICharacterTableFilename ofType:kFileFormat]; 
     ASCII = [[NSDictionary alloc] initWithContentsOfFile:path]; 
    } 

    for (id key in ASCII) 
    { 
     ret = [ret stringByReplacingOccurrencesOfString:key withString:[ASCII objectForKey:key]]; 
    } 

    return ret; 
}  

@end 
+0

ASCII并不意味着你认为它的意思。它是一种编码(并且是一个非常小的编码);它与SGML或XML实体引用无关。此外,有一个更简单,更简单的方法来做到这一点;看到我的答案。 – 2010-02-23 11:39:18

1

我使用

+stringWithContentsOfUrl: encoding: error; 

获取来源,并尝试了几种不同的编码如NSUTF8StringEncoding和NSASCIIStringEncoding,但似乎没有任何影响最终结果字符串。

您误解了encoding:论点的用途。该方法需要以某种方式将字节转换为字符;编码告诉它什么字节序列描述哪些字符。您需要确保编码与资源数据的编码相匹配。

实体引用是一个SGML/XML的东西。 SGML和XML是而不是编码;它们是标记语言语法。 stringWithContentsOfURL:encoding:error:及其堂兄弟们不会尝试以任何方式解析字符序列(语法),这就是他们将一个字符序列(一个实体引用)转换为另一个序列(实体,实际上意味着单个字符字符,即被引用)。

您可以使用the CFXMLCreateStringByUnescapingEntities function将实体引用转换为未转义字符。它需要一个CFString,它是一个NSString(toll-free bridging),并返回一个CFString,它是一个NSString。

+0

谢谢,我会检查一下。 – user278647 2010-03-02 15:49:55