Есть ли способ "автоматического определения" кодировки ресурса при его загрузке с использованием stringFromContentsOfURL?
Есть ли способ "автоматического определения" кодировки ресурса при его загрузке с использованием stringFromContentsOfURL? Текущий (недоработанный) метод, + (id)stringWithContentsOfURL:(NSURL *)url encoding:(NSStringEncoding)enc error:(NSError **)error;
, хочет кодировку URL. Я заметил, что неправильное понимание имеет значение для того, что я хочу сделать. Есть ли способ как-то это проверить и всегда сделать правильно? (Прямо сейчас я использую UTF8.)
2 ответа
Я бы попробовал эту функцию из документов
Возвращает строку, созданную путем чтения данных с заданного URL-адреса, и возвращает по ссылке кодировку, используемую для интерпретации данных.
+ (id)stringWithContentsOfURL:(NSURL *)url usedEncoding:(NSStringEncoding *)enc error:(NSError **)error
это, кажется, угадывает кодировку, а затем возвращает ее вам
Что я обычно делаю при преобразовании данных (строка байтов без кодирования) в строку, так это попытку инициализации строки с использованием различных кодировок. Я бы предложил сначала попробовать наиболее ограничивающие (с точки зрения кодировки) кодировки, такие как 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];