2017-05-30 27 views
0

简而言之,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文字除了“文本”(这导致了同样的问号情况),使用上述所有字符串

产生一个零字节的文件。

我明白我可能会涉水到未知的水域在这里,但如果有人读这之前已经处理了这一点,并愿意提供一些指点,我会非常感激

回答

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以来,writeToFile:atomically已被Apple弃用。

0

虽然我无法找到一种方法只使用JavaScript,我最终使用Objective-C Bridge来完成UTF-8文件写入。

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

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

JXA无法正确执行符号类型(类型和枚举器名称),它根本无法执行原始的四字符代码。要么坚持使用AppleScript,AppleScript是唯一正式支持苹果事件的选项,要么使用Cocoa桥编写NSString文件到NSUTF8StringEncoding,c.f. Patrick的解决方案。

0

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