2010-11-17 83 views
1

NSStringinitWithContentsOfURL:usedEncoding:error:方法將自動檢測到正確的字符串編碼,以解碼來自指定URL的數據。但是,此方法是同步的,我試圖使用NSURLConnection異步執行相同的任務。異步等效於NSString的-initWithContentsOfURL:usedEncoding:錯誤:

我遇到的問題是,當我從URL中獲得NSData時,沒有辦法在不知道編碼的情況下輕鬆將該數據轉換爲NSString。由於我在HTML文檔中提供的URL可以是互聯網上的任何網站,編碼將是各種各樣的東西。

有沒有發現編碼的方法,基本上可以執行什麼initWithContentsOfURL:usedEncoding:error:呢?

+0

您不能將異步加載的NSData存儲到磁盤並使用file:// URL打開它嗎?雖然沒有嘗試過...... – Eiko 2010-11-17 23:32:36

回答

0

如果您正在爲桌面編程,您可以鏈接到Core Services並使用Text Encoding Conversion Manager提供的嗅探器;見TECCreateSniffer()及附帶功能。

如果您的目標是iOS,您將不得不異步加載數據,異步將其寫入文件,然後同步使用您提到的NSString方法,或者嘗試使用任何可以啓發的方法自行嗅探編碼或掠奪。

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 
    } 
} 

另外,我建議你通過麥克灰閱讀Friday Q&A 2010-02-19: Character Encodings