Как надежно вытащить текстовый файл неизвестной кодировки в строку NSString на iPhone? - PullRequest
3 голосов
/ 23 июля 2010

Вот некоторый код, который я использую для перетаскивания текстового файла в UITextView с именем textView.

Поскольку я не всегда могу заранее знать кодировку файла, я использую метод -stringWithContentsOfFile:usedEncoding:error:, в котором хранится значение кодировки по ссылке.

Получив кодировку, я открываю файл и, в случае ошибки, распечатываю некоторую информацию:

NSError *_error = nil; 
NSStringEncoding _textEncoding;
NSString *_contentText = [NSString stringWithContentsOfFile:[baseURL path] usedEncoding:&_textEncoding error:&_error];

if (_error) {
    NSLog(@" _error: %@", [_error userInfo]);
    NSLog(@" _textEncoding: %d", _textEncoding);
}

textView.text = _contentText; 

На iPhone , если файл имеет кодировку UTF8, текстовое представление правильно отображает содержимое файла.

На iPhone , если файл закодирован в ASCII(NSASCIIStringEncoding), тогда я получаю странное значение кодировки строки:

2010-07-23 02:57:46.786 App[9160:307]  _error: {
    NSFilePath = "/var/mobile/Applications/0AD83E02-7A2A-4665-8B8F-17E03EE12B9E/Documents/A+B.txt";
}
2010-07-23 02:57:46.791 App[9160:307]  _textEncoding: 805298632

Для NSASCIIStringEncoding я должен получить значение 1, а не 805298632.

Поворот таков, если я открою файл с помощью симулятора , я получу правильное значение кодировки, и текстовое представление отобразит содержимое файла в кодировке ASCII.

Я думаю, что у меня правильный синтаксис, но я предполагаюЯ что-то пропустил, возможно, очевидно.Что я здесь не так делаю?

1 Ответ

1 голос
/ 27 июля 2010
  1. СтрокаWithContentsOfFile: usedEncoding: error: ошибка. Запишите подробности ошибки, чтобы определить причину.
  2. Спецификатор формата должен быть %lx. NSStringEncoding - это NSUInteger, то есть unsigned long на устройстве. Некоторые из перечисленных значений являются шестнадцатеричными значениями.
  3. На какой платформе создается файл? Вы уверены, что кодировка на самом деле ASCII? Вам нужно будет сделать hexdump для файла, чтобы проверить правильность кодировки.
  4. Попробуйте инициализировать _textEncoding равным 0. Перечисленные константы начинаются с 1.
  5. Добавить охранник, чтобы проверить, что возвращаемая строка не равна нулю, прежде чем перейти к представлению. В соответствии с документацией возвращение равно нулю, если произошла ошибка.
...