У меня есть скрипт, который собирает XML-документ с помощью манипуляций со строками (который я написал до того, как открыл для себя XML Suite).
Когда включены определенные символы, такие как £, -(en-dash) и -(длинное тире) (я подозреваю, что все символы, отличные от ascii), они заменяются символом замены Unicode �
(U+FFFD)
.
Это только происходит, когда в начале документа есть заголовок xml: например, <?xml
. Внесение любых изменений в это устраняет проблему и записывает в файл то, что я ожидал. Я предполагаю, что applescript пытается проанализировать строку как xml, но я хочу, чтобы она прошла как строка.
Я пишу в JXA, но включил эквивалент Applescript, так как я думаю, что проблема связана с OSA, и, вероятно, пользователей AppleScript больше!
редактировать: хорошо, я думаю, это больше проблема с кодировкой - чтение как UTF-8 (которым должен быть xml, который я генерирую) приводит к замене символа, но Western или Mac Roman правильно отображают символы. UTF-8 определенно поддерживает эти символы, поэтому я не уверен, что это лучший способ двигаться вперед?
edit 2: Просто чтобы прояснить: я думаю, что происходит то, что символы, отличные от ascii, кодируются чем-то другим, кроме UTF-8, что делает мой вывод XML недействительным. Как я могу заставить applescript или JXA кодировать символы, отличные от ascii, как UTF-8?
Эпплскрипт
set dt to path to desktop as text
set filePath to dt & "test1.txt"
writeTextToFile(text1, filePath, true)
-- using the example handler from the Mac Automation Scripting Guide
on writeTextToFile(theText, theFile, overwriteExistingContent)
try
-- Convert the file to a string
set theFile to theFile as string
-- Open the file for writing
set theOpenedFile to open for access file theFile with write permission
-- Clear the file if content should be overwritten
if overwriteExistingContent is true then set eof of theOpenedFile to 0
-- Write the new content to the file
write theText to theOpenedFile starting at eof
-- Close the file
close access theOpenedFile
-- Return a boolean indicating that writing was successful
return true
-- Handle a write error
on error
-- Close the file
try
close access file theFile
end try
-- Return a boolean indicating that writing failed
return false
end try
end writeTextToFile
Javascript для автоматизации
app.includeStandardAdditions = true
function writeTextToFile(text, file, overwriteExistingContent) {
try {
// Convert the file to a string
var fileString = file.toString()
// Open the file for writing
var openedFile = app.openForAccess(Path(fileString), { writePermission: true })
// Clear the file if content should be overwritten
if (overwriteExistingContent) {
app.setEof(openedFile, { to: 0 })
}
// Write the new content to the file
app.write(text, { to: openedFile, startingAt: app.getEof(openedFile) })
// Close the file
app.closeAccess(openedFile)
// Return a boolean indicating that writing was successful
return true
}
catch(error) {
try {
// Close the file
app.closeAccess(file)
}
catch(error) {
// Report the error is closing failed
console.log(`Couldn't close file: ${error}`)
}
// Return a boolean indicating that writing was successful
return false
}
}
var text = "<?xml £"
var file = Path("Users/benfrearson/Desktop/text.txt")
writeTextToFile (text, file, true)
text1
, чтобы воспроизвести вашу проблему? Это должно бытьset text1 to "<?xml £"
? Потому что, когда я добавляю эту строку кода и запускаю ваш AppleScript, он записывает на Рабочий стол новый файл с именем test1.txt. Если я затем открою этот результирующий файл, например. TextEdit имеет следующее содержимое:<?xml £
- Вы говорите, что это не то, что происходит для вас, и вместо этого содержимое имеет юникод? - person RobC   schedule 19.05.2020