如何使用JavaScript为Mac Automation编写UTF-8文件?

时间:2017-05-30 17:29:53

标签: javascript macos applescript jxa

简而言之 - 与AppleScript的as «class utf8»相比,Mac Automation的JavaScript是什么?

我有一个unicode字符串,我正在尝试使用JavaScript for Mac Automation写入文本文件。

将字符串写入文件时,任何存在的unicode字符都会成为文件中的问号(ASCII char 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" })

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

  • Unicode文字
  • 的Unicode
  • 班级utf8
  • «class utf8»
  • UTF8
  • 文本
  • utf8 text

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

我知道我可能会在这里涉及未知的水域,但是如果有人在阅读这篇文章之前已经处理过这个并且愿意提供一些指示,那么我将非常感激

4 个答案:

答案 0 :(得分:2)

如果您想确保您的文件使用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起,Apple已弃用writeToFile:atomically

答案 1 :(得分:1)

@PatrickWaynethe 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
  
};




答案 2 :(得分:0)

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

这是我使用的代码。这是调用Objective-C NSString类的JavaScript代码,它取代了我上面提到的writeTextToFile函数:

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

答案 3 :(得分:0)

JXA不能正确执行符号类型(类型和枚举器名称),并且根本不能执行原始的四字符代码。要么坚持使用AppleScript,这是唯一正式支持Apple事件的选项,要么使用Cocoa桥将NSString写入NSUTF8StringEncoding,c.f。帕特里克的解决方案。