2015-03-16 34 views
5

Jeśli napiszę plik tekstowy przy użyciu standardowych wersji, oczywiście mogę skonfigurować kodowanie w torbie parametrów. W AppleScript napisałbym "class utf8", ale jaką wartość użyć w JXA? Próbowałem ciągi "UTF8", "utf8", "class utf8" bez powodzenia. Błąd jest zawsze: "Błąd: nie można dokonać konwersji typów (-1700)". Jeśli użyję "tekstu", plik zostanie zapisany w MACROMAN.JXA: Ustaw kodowanie UTF-8 podczas zapisywania plików

Samodzielny przykład poniżej:

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

Dodanie po Foo za odpowiedź:

Czytam odpowiednich akapitów w dokumentacji https://developer.apple.com/library/mac/releasenotes/InterapplicationCommunication/RN-JavaScriptForAutomation/index.html#//apple_ref/doc/uid/TP40014508-CH109-SW17

i

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

korzystaniaZamiast tego używaj mostu ObjectiveC. Ten przykład działa

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

Jeśli dobrze rozumiem, to poniższy przykład powinien działać, ze względu na konwencję jak ObjectiveC Metody są nazywane w mostku (usunięcie jelita grubego, dodać CamelCase), ale tak nie jest. Żaden plik nie został zapisany, a wartość zwracana jest fałszywa.

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

Co mi się nie podobało? Nie wiem nawet, jak przekazać odpowiedni Errorhandler jako parametr czwarty i czy trzeci parametr ma poprawną wartość.

Odpowiedz

2

Mostek zdarzeń JXA firmy Apple zawiera wiele uszkodzonych i brakujących funkcji (np. Możliwość używania kodów surowych kodów AE). Zamiast tego użyj mostu ObjC; patrz -[NSString writeToFile:atomically:encoding:error:].

+0

Dziękuję za Twój wkład. Przeczytałem dokumentację, zredagowałem moje pytanie i dodałem kilka minimalnych przykładów. – nwehrle

5

spróbuj

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

Pracował tutaj! Dostępne kodowania są wymienione w dokumentacji NSString (zobacz swój link)!
Ciesz się, Michael/Hamburg

+0

Pokonaj mnie! Właśnie napisałem tę samą odpowiedź, która również sprawdziła się u mnie. –

+0

Dziękuję. To dobrze działa. Chciałbym przegłosować odpowiedź twoją i foo, jeśli mam dość reputacji. Moje obejście do foo wymyśliło, że ObjC Bridge używał node.js i wymaga "kodowania": encoding.convert (dane, 'UTF-8', 'MACROMAN'); Grüsse aus Zürich nach Hamburg. – nwehrle