9

如果我使用标准添加编写文本文件,我显然可以在参数包中配置编码。在 AppleScript 中我会写 «class 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 的回答之后添加:

我阅读了文档https://developer.apple.com/library/mac/releasenotes/InterapplicationCommunication/RN-JavaScriptForAutomation/index.html#//apple_ref/doc/uid/TP40014508-CH109-SW17中的相关段落

https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/index.html#//apple_ref/occ/instm/NSString/writeToFile:atomically:encoding:error

改为使用 ObjectiveC 桥接器。这个例子有效

str = $.NSString.alloc.initWithUTF8String('foo')
str.writeToFileAtomically('/tmp/foo', true)

如果我理解正确,以下示例应该可以工作,因为在桥中如何命名 ObjectiveC 方法的约定(删除冒号,添加驼峰式),但事实并非如此。没有文件被写入,返回值为 false。

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

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

4

2 回答 2

9

请试试

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

在这里工作!NSString 文档中列出了可用的编码(请参阅您的链接)!
享受,迈克尔/汉堡

于 2015-03-18T22:22:39.823 回答
4

JXA 的 Apple 事件桥存在许多缺陷和缺失的功能(例如,使用原始 AE 代码的能力)。改用它的 ObjC 桥接器;见-[NSString writeToFile:atomically:encoding:error:]

于 2015-03-16T22:38:34.680 回答