Асинхронный эквивалент NSString -initWithContentsOfURL: usedEncoding: error: - PullRequest
1 голос
/ 18 ноября 2010
Метод

NSString initWithContentsOfURL:usedEncoding:error: автоматически определит правильное кодирование строки для декодирования данных с указанного URL. Однако этот метод является синхронным, и я пытаюсь выполнить ту же задачу асинхронно, используя NSURLConnection.

Проблема, с которой я сталкиваюсь, заключается в том, что когда я получаю NSData из URL, нет способа легко преобразовать эти данные в NSString, не зная кодировку. Поскольку я добавляю документы HTML, URL-адреса могут быть любыми веб-сайтами в Интернете, а кодировки будут разными вещами.

Есть ли способ обнаружить кодировку, чтобы в основном выполнить именно то, что делает initWithContentsOfURL:usedEncoding:error:?

Ответы [ 2 ]

2 голосов
/ 22 ноября 2010

Вот как будет выглядеть ваш 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
    }
}

Также я предлагаю вам прочитать Пятничные вопросы и ответы 2010-02-19: Кодировка символов от MikeAsh.

0 голосов
/ 18 ноября 2010

Если вы программируете для настольного компьютера, вы можете связать его в Core Services и использовать анализатор, предоставляемый диспетчером преобразования кодировки текста;см. TECCreateSniffer() и сопутствующие функции.

Если вы ориентируетесь на iOS, вам придется либо загрузить данные асинхронно, записать их в файл асинхронно, а затем синхронно использовать упомянутый вами метод NSString, илипопытайтесь самостоятельно прослушать кодировку, используя любую эвристику, которую вы можете создать или разграбить.

...