如何使用 JavaScript 为 Mac 自动化编写 UTF-8 文件?

How can I write UTF-8 files using JavaScript for Mac Automation?

简而言之 - Mac 的 JavaScript 与 AppleScript 的 as «class utf8» 等价的自动化是什么?

我有一个 unicode 字符串,我正尝试使用 JavaScript 将其写入文本文件以实现 Mac 自动化。

将字符串写入文件时,出现的任何 unicode 字符都会在文件中变成问号(ASCII 字符 3F)。

如果这是 AppleScript 脚本而不是 JavaScript 脚本,我可以通过添加 as «class utf8» 原始语句来解决这个问题,如 Takashi Yoshida 的博客 (https://takashiyoshida.org/blog/applescript-write-text-as-utf8-string-to-file/) 中所述。

然而,该脚本已经用 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)。根据 StandardAdditions 字典,我在以下调用中添加了一个 as 参数:

// Write the new content to the file
app.write(text, { to: openedFile, startingAt: app.getEof(openedFile), as: "utf8" })

并尝试了以下所有字符串(如书面形式和小写形式):

除了 "text"(导致相同的问号情况)之外,使用上述所有字符串产生了一个零字节文件。

我知道我可能会涉足这里的未知水域,但是如果阅读这篇文章的人以前处理过这个问题并且愿意提供一些指导,我将非常感激

虽然我找不到仅使用 JavaScript 的方法,但我最终使用 Objective-C 桥来完成 UTF-8 文件写出。

这是我使用的代码。这是调用 Objective-C NSString class 的 JavaScript 代码,它完全替换了我上面提到的 writeTextToFile 函数:

objCText = $.NSString.alloc.initWithUTF8String(text);
objCText.writeToFileAtomically(filePathString, true);

如果你想确保你的文件以 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 明确指定要使用的编码。最重要的是,writeToFile:atomically 自 OS X 10.4 以来已被 Apple 弃用。

JXA 不能正确处理符号类型(类型和枚举器名称),它根本不能处理原始的四字符代码。要么坚持使用 AppleScript,这是唯一官方支持的能够正确表达 Apple 事件的选项,要么使用 Cocoa 桥将 NS​​String 写入 NSUTF8StringEncoding c.f 中的文件。帕特里克的解决方案。

@PatrickWayne has .

我的库中已经有这个函数,所以我想我会分享它。 它使用相同的键盘命令。

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
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
  
};