JXA:写入文件时设置UTF-8编码

JXA:写入文件时设置UTF-8编码,utf-8,applescript,osx-yosemite,javascript-automation,Utf 8,Applescript,Osx Yosemite,Javascript Automation,如果我使用standardadditions编写文本文件,我显然可以在参数包中配置编码。在AppleScript中我会写«类utf8»,但在JXA中使用哪个值呢? 我尝试了字符串“UTF8”、“UTF8”、“class UTF8”,但没有成功。错误总是:“错误:无法转换类型。(-1700)”。如果我使用“文本”,文件是用MACROMAN编写的 独立示例如下: var exportFileWriter = fileWriter('/Users/norman/mini.txt'); exportFi

如果我使用standardadditions编写文本文件,我显然可以在参数包中配置编码。在AppleScript中我会写«类utf8»,但在JXA中使用哪个值呢? 我尝试了字符串“UTF8”、“UTF8”、“class UTF8”,但没有成功。错误总是:“错误:无法转换类型。(-1700)”。如果我使用“文本”,文件是用MACROMAN编写的

独立示例如下:

var exportFileWriter = fileWriter('/Users/norman/mini.txt');
exportFileWriter.write('äöü');
exportFileWriter.close();


function fileWriter(pathAsString) {
    'use strict';

    var app = Application.currentApplication();
    app.includeStandardAdditions = true;

    var path = Path(pathAsString);
    var file = app.openForAccess(path, {writePermission: true});

    /* reset file length */
    app.setEof(file, {to: 0});

    return {
        write: function(content) {
            /* How can I write UTF-8? */
            app.write(content, {to: file, as: 'text'});
        },
        close: function() {
            app.closeAccess(file);
        }
    };
}
在foo的回答后添加:

我阅读了文件中的相关段落

:

改为使用Objective桥。这个例子有效

str = $.NSString.alloc.initWithUTF8String('foo')
str.writeToFileAtomically('/tmp/foo', true)
如果我理解正确,下面的示例应该可以工作,因为有一个惯例,就是Objective方法在桥中的命名方式(删除冒号,添加camelcase),但它不能。未写入任何文件,返回值为false

str = $.NSString.alloc.initWithUTF8String('foo')
str.writeToFileAtomicallyEncodingError('/tmp/foo', true, 'UTF-8', null);

我做错了什么?我甚至不知道如何将正确的Errorhandler作为第四个参数传递,以及第三个参数是否具有正确的值。

JXA的Apple事件桥存在许多缺陷和缺失的功能(例如,使用原始AE代码的能力)。用它的ObjC桥代替;请参见
-[NSString writeToFile:atomicaly:encoding:error:][/code>

请重试

str = $.NSString.alloc.initWithUTF8String('foo');
str.writeToFileAtomicallyEncodingError('/tmp/foo', true, $.NSUTF8StringEncoding, null);
在这里工作!NSString文档中列出了可用的编码(请参见您的链接)

迈克尔/汉堡,祝您愉快

谢谢您的意见。我阅读了一些文档,编辑了我的问题,并添加了一些简单的例子。快来吧!我刚刚发布了同样的答案,这对我也很有用。谢谢。它工作得很好。如果我有足够的声誉,我会投票支持你和福的回答。在foo提出ObjC桥之前,我的解决方法是使用node.js并要求“encoding”:encoding.convert(数据“UTF-8”、“MACROMAN”);汉堡是一个富有的国家。