异步等效于NSString的-initWithContentsOfURL:usedEncoding:error:

时间:2010-11-17 23:14:40

标签: objective-c cocoa nsstring nsdata

NSString的{​​{1}}方法会自动检测正确的字符串编码,以解码指定网址中的数据。但是,此方法是同步的,我尝试使用initWithContentsOfURL:usedEncoding:error:异步执行相同的任务。

我遇到的问题是,当我从网址获取NSURLConnection时,没有方法可以在不知道编码的情况下轻松地将该数据转换为NSData。当我拉入HTML文档时,URL可能是互联网上的任何网站,编码将是各种各样的事情。

有没有办法发现编码,基本上完全按照NSString执行的操作?

2 个答案:

答案 0 :(得分:2)

以下是connection:didReceiveResponse:委托方法的样子:

- (void) connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    NSStringEncoding nsEncoding = 0;
    NSString *textEncodingName = [response textEncodingName];
    if (textEncodingName)
    {
        CFStringEncoding cfEncoding = CFStringConvertIANACharSetNameToEncoding((CFStringRef)textEncodingName);
        if (cfEncoding != kCFStringEncodingInvalidId)
        {
            nsEncoding = CFStringConvertEncodingToNSStringEncoding(cfEncoding);
        }
    }

    if (nsEncoding != 0)
    {
        // Great, you have your encoding
    }
    else
    {
        // You are on your own, you have to apply a heuristic
    }
}

另外,我建议你阅读Mike Ash的Friday Q&A 2010-02-19: Character Encodings

答案 1 :(得分:0)

如果您正在为桌面编程,则可以在Core Services中链接并使用Text Encoding Conversion Manager提供的嗅探器;见TECCreateSniffer()及附带的功能。

如果您的目标是iOS,则必须异步加载数据,异步写入文件,然后同步使用您提到的NSString方法,或尝试使用任何启发式方法自行嗅探编码你可以制作或掠夺。