Есть ли способ автоматически определить кодировку ресурса при его загрузке с помощью stringFromContentsOfURL?

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


person Moshe    schedule 04.08.2011    source источник
comment
Вы можете загрузить строку самостоятельно и проверить заголовок набора символов.   -  person Joe    schedule 05.08.2011


Ответы (2)


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

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

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

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

person Dave.B    schedule 04.08.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];
person Alex Nichol    schedule 05.08.2011
comment
И будет ли theString всегда нулевым, если он не инициализирован с правильной кодировкой? - person Moshe; 06.08.2011