Как создать и записать текстовый файл UTF-16 с помощью Applescript? - PullRequest
3 голосов
/ 13 февраля 2011

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

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

"Если вы случайно прочитали файл UTF-16 как MacRoman, результирующее значение может выглядеть на первый взгляд как обычный строка, особенно если она содержит Английский текст. Вы быстро обнаружите что-то очень плохо, когда ты попробуйте использовать его, однако: общее Симптом состоит в том, что каждый видимый символ в вашей "строке", кажется, есть невидимый персонаж перед ним. Например, чтение в кодировке UTF-16 текстовый файл, содержащий фразу «Hello» Мир! "Как строка производит строку как "H e l l o W o r l d!", где каждый "" действительно невидимый ASCII 0 символов. "

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

"Yes" = "Yes";

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

 " Y e s "  =  " O u i " ;

Вот мой метод 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 ]

0 голосов
/ 15 февраля 2011

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

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


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

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

[3] Не стесняйтесь сообщать об ошибках в Apress.

0 голосов
/ 13 февраля 2011

Вот обработчики, которые я использую для чтения и записи как UTF16.Вам не нужен отдельный обработчик «создать файл».Обработчик записи создаст файл, если он не существует.Установите для переменной "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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...