9

standardadditions を使用してテキストファイルを作成すると、明らかにパラメーター バッグでエンコーディングを構成できます。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);

私は何を間違えたのですか?適切な Errorhandler を 4 番目のパラメーターとして渡す方法と、3 番目のパラメーターに適切な値があるかどうかさえわかりません。

4

2 に答える 2

9

してみてください

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

ここで働いた!利用可能なエンコーディングは NSString ドキュメント内にリストされています (リンクを参照してください)!
楽しんで、マイケル / ハンブルグ

于 2015-03-18T22:22:39.823 に答える