如何使用JavaScript for Mac Automation编写UTF-8文件?
简而言之,AppleScript的as «class utf8»
等效于Mac Automation的JavaScript是什么?如何使用JavaScript for Mac Automation编写UTF-8文件?
我有一个unicode字符串,我试图写入使用JavaScript的Mac自动化的文本文件。
将字符串写入文件时,存在的任何unicode字符都会成为该文件中的问号(ASCII字符3F
)。
如果这是一个AppleScript脚本而不是JavaScript脚本,我可以通过在Takashi Yoshida的博客(https://takashiyoshida.org/blog/applescript-write-text-as-utf8-string-to-file/)上解释,添加as «class utf8»
原始语句来解决此问题。
但是,该脚本已经使用JavaScript编写,因此我正在寻找与此AppleScript语句等效的JavaScript。 Apple关于原始语句的页面只能解决AppleScript(https://developer.apple.com/library/content/documentation/AppleScript/Conceptual/AppleScriptLangGuide/conceptual/ASLR_raw_data.html)。
要编写该文件,我正在使用Apple自己的writeTextToFile
JavaScript函数示例(https://developer.apple.com/library/content/documentation/LanguagesUtilities/Conceptual/MacAutomationScriptingGuide/ReadandWriteFiles.html#//apple_ref/doc/uid/TP40016239-CH58-SW1)。我添加了一个as
参数下面的调用,根据StandardAdditions词典:
// Write the new content to the file
app.write(text, { to: openedFile, startingAt: app.getEof(openedFile), as: "utf8" })
并试过所有的以下字符串(如小写的形式写成,也):
- Unicode文本
- 的Unicode
- 类UTF8
- «类UTF8»
- UTF8
- 文本
- UTF8文字除了“文本”(这导致了同样的问号情况),使用上述所有字符串
产生一个零字节的文件。
我明白我可能会涉水到未知的水域在这里,但如果有人读这之前已经处理了这一点,并愿意提供一些指点,我会非常感激
如果你想确保你的文件被使用UTF8编码编写的,使用NSString的writeToFile:atomically:encoding:error
功能,像这样:
fileStr = $.NSString.alloc.initWithUTF8String('your string here')
fileStr.writeToFileAtomicallyEncodingError(filePath, true, $.NSUTF8StringEncoding, $())
你会认为,写从UTF8字符串初始化一个NSString对象将得到写出为UTF8,但我从经验writeToFile:atomically
不兑现的字符串编码被写出来发现。 writeToFile:atomically:encoding:error
明确指定要使用哪种编码。另外,自OS X 10.4以来,writeToFile:atomically
已被Apple弃用。
虽然我无法找到一种方法只使用JavaScript,我最终使用Objective-C Bridge来完成UTF-8文件写入。
这是我使用的代码。这是调用Objective-C的NSString类的JavaScript代码,它取代了writeTextToFile
功能我上面一共提到:
objCText = $.NSString.alloc.initWithUTF8String(text);
objCText.writeToFileAtomically(filePathString, true);
JXA无法正确执行符号类型(类型和枚举器名称),它根本无法执行原始的四字符代码。要么坚持使用AppleScript,AppleScript是唯一正式支持苹果事件的选项,要么使用Cocoa桥编写NSString文件到NSUTF8StringEncoding,c.f. Patrick的解决方案。
@PatrickWayne有the correct solution。
我已经有了这个函数在我的lib中,所以我想我会分享它。 它使用相同的键盘命令。
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
function writeFile(pPathStr, pOutputStr) { // @File @Write @ObjC
/* VER: 2.0 2017-03-18
---------------------------------------------------------------
PARAMETERS:
pPathStr | string | Path of file to write. May use tilde (~)
pOutputStr | string | String to be output to file.
*/
//--- CONVERT TO NS STRING ---
var nsStr = $.NSString.alloc.initWithUTF8String(pOutputStr)
//--- EXPAND TILDE AND CONVERT TO NS PATH ---
var nsPath = $(pPathStr).stringByStandardizingPath
//--- WRITE TO FILE ---
// Returns true IF successful, ELSE false
var successBool = nsStr.writeToFileAtomicallyEncodingError(nsPath, false, $.NSUTF8StringEncoding, null)
if (!successBool) {
throw new Error("function writeFile ERROR:\nWrite to File FAILED for:\n" + pPathStr)
}
return successBool
};