NSUTF8StringEncoding приводит к неправильной визуализации файла в TextEdit / Pages, но не BBEdit / vi - PullRequest
4 голосов
/ 21 августа 2010

У меня немного странная проблема. Всякий раз, когда я создаю новый текстовый файл в своем приложении для iOS, я устанавливаю его кодировку NSUTF8StringEncoding. Если я отредактирую файл и введу любые символы с диакритическими знаками и сохрану изменения, диакритические знаки правильно отображаются в некоторых приложениях, таких как BBEdit, TextMate, cat и vi, но не в других, таких как TextEdit, Quick Look и Pages.

Я использую следующий код для сохранения содержимого UITextView в простые текстовые файлы.

  NSError *error;
  NSString *dataString = self.textView.text;
  BOOL savedChanges = [dataString writeToFile:fullPath atomically:YES encoding:NSUTF8Encoding error:&error]; 
  if (!savedChanges)
  {
    // Pop up an alert saying something went wrong.
  }

What happens after saving my file.  Should say I Love It with some weird diacritics

Команда unix file сообщает, что сохраненный файл действительно является «UTF-8 Unicode text, без разделителей строки»

Что еще страннее, если я снова сохраню файл, не меняя содержания текста, файл будет правильно отображаться в Quick Look & TextEdit на моем Mac.

Любая помощь будет оценена.

Ответы [ 4 ]

1 голос
/ 21 августа 2010

Если вы сохраните текстовый файл с UTF BOM, а xattr com.apple.TextEncoding не будет установлен, любое открывающее его программное обеспечение должно будет угадать правильную кодировку символов.Некоторые приложения предполагают UTF-8, некоторые предполагают Mac OS Roman, а другие предполагают что-то еще.

Вы можете повторить это поведение, сохранив файл как UTF-8 без спецификации, а затем в Терминале введите команду xattr -d com.apple.TextEncoding filename.txt.

Чтобы установить xattr, вы должны вызвать setxattr ().Кажется, не существует документированного способа установить его с помощью API Какао.Вы также можете добавить к своим данным префикс UTF-8.

Возникает вопрос о том, какую кодировку символов следует предполагать, если отсутствуют BOM и xattr.Это ошибка, если по умолчанию используется Mac OS Roman?Должен ли UTF-8 использоваться по умолчанию?

1 голос
/ 21 августа 2010

Это предположение, но может ли это быть связано с отсутствием метки порядка байтов ? Для UTF8 спецификация выглядит как EF BB BF в шестнадцатеричном виде и должна быть самой первой вещью в файле.

0 голосов
/ 22 августа 2010

Я столкнулся с той же проблемой только вчера! Моя проблема состояла в том, что файлы, созданные с помощью NSString writeToFile:atomically:encoding:error:, отлично читались и интерпретировались QuickLook и Text Edit, но файлы, созданные путем записи данных UTF-8 прямо в файл с NSFileHandle, сделалине работает в QL & TE (автоматическое кодирование дает ошибку).

Питер Хоси указал мне на этот вопрос, и после некоторого тестирования выясняется, что метод NSString не используетВ спецификации вместо этого используется расширенный атрибут com.apple.TextEncoding.С помощью некоторого кода, который я нашел в Интернете, я создал категорию NSString, чтобы вы могли легко установить это значение, передав путь к файлу и значение NSStringEncoding.

NSString (FileTextEncodingAttribute) на gist.github

Примером может быть:

[NSString setTextEncodingAttribute:NSUTF8StringEncoding atPath:@"myfile.txt"];

Я проверил это, и оно отлично работает :) Кто бы знал, что написание простого текстового файла потребует очень много исследований !!

0 голосов
/ 21 августа 2010

Еще одна альтернатива, если вы хотите избежать спецификации, - установить для расширенного атрибута com.apple.TextEncoding значение UTF-8;134217984 в файле - Подробнее см. Здесь .

ДонНе знаю, как вы это сделаете из кода, но xattr -w com.apple.TextEncoding 'UTF-8;134217984' filename.txt сделает это в командной строке, чтобы подтвердить, что это решит проблему для вас.

...