iPhone SDK - HTML源代码中的stringWithContentsOfUrl ASCII字符

时间:2010-02-22 11:51:30

标签: iphone objective-c cocoa

当我获取任何网页的来源时,无论我使用何种编码,我总是最终使用&# - 字符(例如©或®)而不是实际的字符本身。这也适用于外国人(例如瑞典语中的åäö),我必须从“& Aring”等解析。

我正在使用

+stringWithContentsOfUrl: encoding: error; 

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

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

问候

3 个答案:

答案 0 :(得分:1)

  

我正在使用

+stringWithContentsOfUrl: encoding: error; 
     

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

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

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

真的,真的很糟糕。我想直接转换它,上面的解决方案并不是很好,所以我只编写了自己的ascii-table转换器(静态)类。因为本来应该工作(虽然我必须自己填写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