2015-03-16 12 views
5

Se scrivo un file di testo utilizzando le standardadditions, ovviamente posso configurare la codifica in un parametro bag. In AppleScript scriverei «class utf8» ma quale valore usare in JXA? Ho provato le stringhe "UTF8", "utf8", "class utf8" senza successo. L'errore è sempre: "Errore: impossibile convertire i tipi. (-1700)". Se uso "testo" il file è scritto in MACROMAN.JXA: imposta la codifica UTF-8 quando si scrivono i file

esempio Standalone di seguito:

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

Aggiunta dopo la risposta di foo:

Ho letto i punti rilevanti nella documentazione https://developer.apple.com/library/mac/releasenotes/InterapplicationCommunication/RN-JavaScriptForAutomation/index.html#//apple_ref/doc/uid/TP40014508-CH109-SW17

e

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

da usare il Invece il bridge ObjectiveC. Questo esempio funziona

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

Se ho capito bene, l'esempio seguente dovrebbe funzionare, a causa della convenzione come metodi ObjectiveC sono chiamati all'interno del ponte (rimuovere i due punti, aggiungi CamelCase), ma non è così. Nessun file è stato scritto e il valore restituito è falso.

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

Cosa ho sbagliato? Non so nemmeno come passare un Errorhandler corretto come 4 ° parametro e se il 3 ° parametro ha il valore corretto.

risposta

2

Il bridge di eventi Apple di JXA è imperfetto con molte funzionalità menomate e mancanti (ad esempio la possibilità di utilizzare codici AE grezzi). Usa invece il suo ponte ObjC; vedi -[NSString writeToFile:atomically:encoding:error:].

+0

Grazie per l'input. Ho letto alcuni documenti, ho modificato la mia domanda e aggiunto alcuni esempi minimi. – nwehrle

5

riprova

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

lavorato qui! Le codifiche disponibili sono elencate nella documentazione NSString (vedi il tuo link)!
Enjoy, Michael/Hamburg

+0

Picchiami! Stavo semplicemente postando la stessa risposta, che ha funzionato anche per me. –

+0

Grazie. Funziona bene. Eviterei la risposta di e foo se avessi abbastanza reputazione. La mia soluzione è stata quella di utilizzare node.js e richiedere 'encoding': encoding.convert (data, 'UTF-8', 'MACROMAN'); Grüsse aus Zürich Zürich. – nwehrle