Есть ли способ «автоматически определить» кодировку ресурса при его загрузке с помощью stringFromContentsOfURL? Текущий (не устаревший) метод + (id)stringWithContentsOfURL:(NSURL *)url encoding:(NSStringEncoding)enc error:(NSError **)error;
требует кодировки URL. Я заметил, что неправильное понимание влияет на то, что я хочу делать. Есть ли способ как-то проверить это и всегда делать это правильно? (Сейчас я использую UTF8.)
Есть ли способ автоматически определить кодировку ресурса при его загрузке с помощью stringFromContentsOfURL?
Ответы (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];
theString
всегда нулевым, если он не инициализирован с правильной кодировкой?
- person Moshe; 06.08.2011