【问题标题】:Asynchronous equivalent to NSString's -initWithContentsOfURL:usedEncoding:error:异步等效于 NSString 的 -initWithContentsOfURL:usedEncoding:error:
【发布时间】:2010-11-17 23:14:40
【问题描述】:

NSStringinitWithContentsOfURL:usedEncoding:error: 方法会自动检测正确的字符串编码来解码来自指定 URL 的数据。但是,此方法是同步的,我正在尝试使用 NSURLConnection 异步执行相同的任务。

我遇到的问题是,当我从 URL 获取 NSData 时,没有任何方法可以在不知道编码的情况下轻松将该数据转换为 NSString。当我提取 HTML 文档时,URL 可以是 Internet 上的任何网站,并且编码将是各种各样的东西。

有没有办法发现编码,基本上完全执行initWithContentsOfURL:usedEncoding:error: 所做的事情?

【问题讨论】:

  • 您不能将异步加载的 NSData 存储到磁盘并使用 file:// URL 打开它吗?不过没试过……

标签: objective-c cocoa nsstring nsdata


【解决方案1】:

您的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

【讨论】:

    【解决方案2】:

    如果你是为桌面编程,你可以在核心服务中链接,并使用文本编码转换管理器提供的嗅探器;请参阅TECCreateSniffer() 和随附的功能。

    如果您的目标是 iOS,您将不得不异步加载数据,将其异步写入文件,然后同步使用您提到的 NSString 方法,或者尝试使用您可以使用的任何启发式自行嗅探编码工艺或掠夺。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-10
      • 1970-01-01
      • 2021-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多