iOS: как лучше всего определить кодировку файла

В некоторых случаях мне действительно нужно знать кодировку файла при чтении файла. Иногда мы можем сделать как Руководство по программированию строк Apple предлагает:

Чтение данных с неизвестной кодировкой

Если вы обнаружили у себя текст неизвестной кодировки, лучше всего убедиться в наличии механизма исправления неизбежных ошибок. Например, приложения Apple Mail и Safari имеют меню кодировки, а TextEdit позволяет пользователю повторно открыть файл с явно заданной кодировкой.

Если вы вынуждены угадывать кодировку (и обратите внимание, что при отсутствии явной информации это догадка):

  1. Попробуйте stringWithContentsOfFile:usedEncoding:error: или initWithContentsOfFile:usedEncoding:error: (или эквиваленты на основе URL).

    Эти методы пытаются определить кодировку ресурса и в случае успеха возвращают по ссылке используемую кодировку.

  2. Если (1) не удается, попробуйте прочитать ресурс, указав в качестве кодировки UTF-8.

  3. Если (2) не удается, попробуйте соответствующую устаревшую кодировку.

    «Подходящий» здесь немного зависит от обстоятельств; это может быть кодировка строки C по умолчанию, это может быть ISO или Windows Latin 1 или что-то еще, в зависимости от того, откуда поступают ваши данные.

  4. Наконец, вы можете попробовать методы загрузки NSAttributedString из Application Kit (например, initWithURL:options:documentAttributes:error:).

    Эти методы пытаются загрузить простые текстовые файлы и возвращают используемую кодировку. Их можно использовать в более или менее произвольных текстовых документах, и их стоит рассмотреть, если ваше приложение не имеет специального опыта работы с текстом. Они могут не подходить для инструментов уровня Foundation или документов, которые не являются текстом на естественном языке.

Тут я столкнулся с некоторой проблемой. Иногда я могу узнать ошибку. Например, когда я читаю файл кодировки GB2312 с использованием UTF8, я получаю ноль, поэтому я знаю ошибку. Но когда я читаю файл кодировки GB2312, используя способ BIG5, я не могу узнать ошибку.

Метод инициализации NSAttributedString может работать на Mac, но когда дело доходит до iOS, ему нужна iOS7, что не так хорошо.

Я также ищу его и нахожу некоторые обсуждения, например это на CocoBuilder, а также на Mac. Тогда как насчет iOS?


person keywind    schedule 17.09.2013    source источник
comment
Я передаю большой файл и должен читать его по частям   -  person keywind    schedule 17.09.2013


Ответы (1)


Вы можете использовать stringWithContentsOfFile:usedEncoding:error:, который возвращает, помимо новой строки, использованную кодировку.

Но вы не всегда сможете определить кодировку файла.

person talki    schedule 17.09.2013
comment
Это работает только для некоторых распространенных кодировок, таких как utf8 и utf16, не работает для gb2312, big5 и так далее. - person keywind; 18.09.2013