Как создать и записать текстовый файл UTF-16 с помощью Applescript?

Я пишу Applescript для разбора файла локализации iOS ( /en.lproj/Localizable.strings ), переводит значения и выводит перевод ( /fr.lproj/Localizable.strings ) на диск в кодировке UTF-16 (Unicode) ,

По какой-то причине сгенерированный файл имеет дополнительное пространство между каждой буквой. После некоторого рытья я нашел причину проблемы в «Учиться AppleScript»: «Полное руководство по написанию сценариев».

«Если вы случайно прочитали файл UTF-16 в качестве MacRoman, результирующее значение может выглядеть на первый взгляд как обычная строка, особенно если она содержит текст на английском языке. Вы быстро обнаружите, что что-то не так, когда вы пытаетесь его использовать, однако: общий признак состоит в том, что каждый видимый символ в вашей «строке», кажется, имеет перед ним невидимый символ. Например, чтение текстового файла с кодировкой UTF-16, содержащего фразу «Hello World!» в виде строки, создает строка как "H ello W orld! ", где каждый" "действительно является невидимым символом ASCII 0".

Так, например, мой английский файл строки локализации имеет:

"Yes" = "Yes"; 

И сгенерированный французский файл строки локализации имеет:

  " Y es " = " O ui " ; 

Вот мой метод createFile :

 on createFile(fileFolder, fileName) tell application "Finder" if (exists file fileName of folder fileFolder) then set the fileAccess to open for access file fileName of folder fileFolder with write permission set eof of fileAccess to 0 write ((ASCII character 254) & (ASCII character 255)) to fileAccess starting at 0 --write «data rdatFEFF» to fileAccess starting at 0 close access the fileAccess else set the filePath to make new file at fileFolder with properties {name:fileName} set the fileAccess to open for access file fileName of folder fileFolder with write permission write ((ASCII character 254) & (ASCII character 255)) to fileAccess starting at 0 --write «data rdatFEFF» to fileAccess starting at 0 close access the fileAccess end if return file fileName of folder fileFolder as text end tell end createFile 

И вот мой метод writeFile :

 on writeFile(filePath, newLine) tell application "Finder" try set targetFileAccess to open for access file filePath with write permission write newLine to targetFileAccess as Unicode text starting at eof close access the targetFileAccess return true on error try close access file filePath end try return false end try end tell end writeFile 

Любая идея, что я делаю неправильно?

2 Solutions collect form web for “Как создать и записать текстовый файл UTF-16 с помощью Applescript?”

Вот обработчики, которые я использую для чтения и записи как UTF16. Вам не нужен отдельный обработчик «create file». Обработчик записи создаст файл, если он не существует. Установите для переменной «appendText» значение true или false. False означает перезаписать файл, а true означает добавить новый текст в конец текущего текста в файле. Надеюсь, это поможет.

 on writeTo_UTF16(targetFile, theText, appendText) try set targetFile to targetFile as text set openFile to open for access file targetFile with write permission if appendText is false then set eof of openFile to 0 write (ASCII character 254) & (ASCII character 255) to openFile starting at eof -- UTF-16 BOM else tell application "Finder" to set fileExists to exists file targetFile if fileExists is false then set eof of openFile to 0 write (ASCII character 254) & (ASCII character 255) to openFile starting at eof -- UTF-16 BOM end if end if write theText to openFile starting at eof as Unicode text close access openFile return true on error theError try close access file targetFile end try return theError end try end writeTo_UTF16 on readFrom_UTF16(targetFile) try set targetFile to targetFile as text targetFile as alias -- if file doesn't exist then you get an error set openFile to open for access file targetFile set theText to read openFile as Unicode text close access openFile return theText on error try close access file targetFile end try return false end try end readFrom_UTF16 

Если вы получаете фактические пробелы между каждым персонажем, вы, вероятно, получили «(символы i thru j of someText) как« анти-шаблон »в вашем коде [1]. Это разделит строку на список символов, а затем вернет ее в строку с вашим текущим разделителем текстовых элементов, вставленным между каждым символом. Правильный (то есть быстрый и безопасный) способ получения подстроки заключается в следующем: «текст i через j некоторого текста» (p179-181).

OTOH, если вы получаете невидимые символы между каждым символом [2], то да, это будет проблема с кодировкой, обычно считывая файл с кодировкой UTF16 с использованием MacRoman или другого однобайтового кодирования. Если у вашего файла есть действующий знак байтового байта, то любой текстовый редактор с поддержкой Unicode должен читать его с использованием правильной кодировки.


[1] p179 утверждает, что эта идиома небезопасна, но забывает предоставить практическую демонстрацию проблем, которые она вызывает. [3]

[2] В примере IIRC пример на p501 должен был использовать символы прямоугольника для представления невидимых символов, т. Е. «⃞H⃞e⃞l⃞l⃞o» не «H ello», но не вышел таким образом, поэтому может быть неверно истолковано как означающее видимые пространства. [3]

[3] Не стесняйтесь отправлять исправления в Apress.

Interesting Posts

Как выбрать несколько строк в UITableView в режиме редактирования?

Реклама и сканирование iOS Corebluetooth в фоновом режиме

Должен ли я шифровать ключи Amazon S3 в приложении iOS?

Ускорить UIPageViewController

Swift: методы протокола моего делегата должны выполняться на другом контроллере представления

Эквивалент android.content.BroadcastReceiver в Swift

supportedInterfaceOrientations, вызываемый для всех iPhone, кроме 6+

Когда методы appdelegate вызываются по отношению к методам жизненного цикла представления вашего исходного контроллера представления?

IOS6.0 UIWebView Схема Tel:

Добавление, повторное использование и удаление NSLayoutAnchors

Objective-C добавляет функциональность ко всем методам объекта

Как обновить UITableViewCells с помощью NSTimer и NSNotificationCentre в Swift

Мерцание карты Google в iOS

Автозапуск игнорируется в пользовательском UITableViewCell

Контакты. Доступ к значениям телефонов

PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.