2010-11-17 3 views
1

NSStringのメソッドは、指定されたURLからデータをデコードするための正しい文字列エンコーディングを自動的に検出します。しかし、このメソッドは同期的で、NSURLConnectionを使用して同じタスクを非同期に実行しようとしています。NSStringの-initWithContentsOfURL:usedEncoding:error:

私が抱えている問題は、URLからNSDataを取得したときに、エンコードを知らずにそのデータをNSStringに簡単に変換する方法がないことです。私はHTML文書を引っ張っているので、URLはインターネット上のどのWebサイトでもかまいません。エンコーディングはあらゆる種類のものになります。

initWithContentsOfURL:usedEncoding:error:は基本的に正確にエンコードを検出する方法はありますか?

+0

非同期にロードしたNSDataをディスクに保存し、file:// URLで開くことはできませんか?しかし、試していない... – Eiko

答えて

0

デスクトップ用にプログラミングしている場合は、Core Servicesでリンクし、テキストエンコーディング変換マネージャーが提供するスニファを使用できます。 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を読むためにあなたを示唆しています。