Есть ли способ «автоматического определения» кодировки ресурса при его загрузке с использованием stringFromContentsOfURL? - PullRequest
3 голосов
/ 05 августа 2011

Есть ли способ «автоматического определения» кодировки ресурса при его загрузке с использованием stringFromContentsOfURL? Текущий (недоработанный) метод + (id)stringWithContentsOfURL:(NSURL *)url encoding:(NSStringEncoding)enc error:(NSError **)error; хочет использовать кодировку URL. Я заметил, что неправильное понимание имеет значение для того, что я хочу сделать. Есть ли способ как-то это проверить и всегда сделать правильно? (Сейчас я использую UTF8.)

Ответы [ 2 ]

4 голосов
/ 05 августа 2011

Я бы попробовал эту функцию из документов

Возвращает строку, созданную путем чтения данных с заданного URL-адреса, и возвращает по ссылке кодировку, используемую для интерпретации данных.

+ (id)stringWithContentsOfURL:(NSURL *)url usedEncoding:(NSStringEncoding *)enc error:(NSError **)error

это, кажется, угадывает кодировку и затем возвращает ее вам

2 голосов
/ 06 августа 2011

Что я обычно делаю при преобразовании данных (строки байтов без кодирования) в строку, так это попытку инициализации строки с использованием различных кодировок. Я бы предложил сначала попробовать наиболее ограничивающие (с точки зрения кодировки) кодировки, такие как ASCII и UTF-8, а затем попробовать UTF-16. Если ни одна из них не является допустимой кодировкой, вы должны попытаться декодировать строку с использованием резервной кодировки, такой как NSWindowsCP1252StringEncoding, которая почти всегда будет работать. Для этого вам необходимо загрузить содержимое страницы с помощью NSData, чтобы вам не приходилось перезагружать каждую попытку кодирования. Ваш код может выглядеть так:

NSData * urlData = [NSData dataWithContentsOfURL:aURL];
NSString * theString = [[NSString alloc] initWithData:urlData encoding:NSASCIIStringEncoding];
if (!theString) {
    theString = [[NSString alloc] initWithData:urlData encoding:NSUTF8StringEncoding];
}
if (!theString) {
    theString = [[NSString alloc] initWithData:urlData encoding:NSUTF16StringEncoding];
}
if (!theString) {
    theString = [[NSString alloc] initWithData:urlData NSWindowsCP1252StringEncoding];
}
// ...
// use theString here...
// ...
[theString release];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...