2015-03-16 1 views
5

Si j'écris un fichier texte en utilisant les standardadditions, je peux évidemment configurer l'encodage dans un sac de paramètres. En AppleScript j'écrirais «class utf8» mais quelle valeur utiliser dans JXA? J'ai essayé les cordes "UTF8", "utf8", "classe utf8" sans succès. L'erreur est toujours: "Erreur: Impossible de convertir les types. (-1700)". Si j'utilise "text" le fichier est écrit en MACROMAN.JXA: Définir l'encodage UTF-8 lors de l'écriture de fichiers

exemple autonome ci-dessous:

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

addition après la réponse de foo:

Je lis les paragraphes pertinents dans la documentation https://developer.apple.com/library/mac/releasenotes/InterapplicationCommunication/RN-JavaScriptForAutomation/index.html#//apple_ref/doc/uid/TP40014508-CH109-SW17

et

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

à utiliser la Pont ObjectiveC à la place. Cet exemple fonctionne

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

Si je comprends bien, l'exemple suivant devrait fonctionner, en raison de la convention comment ObjectiveC méthodes sont nommés dans le pont (retirer deux points, ajouter camelcase), mais il ne fonctionne pas. Aucun fichier n'a été écrit et la valeur de retour est false.

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

Qu'est-ce que j'ai fait de mal? Je ne sais même pas comment passer un Errorhandler correct comme 4ème paramètre et si le 3ème param a la bonne valeur.

Répondre

2

Le pont d'événements Apple de JXA est défectueux et présente de nombreuses fonctionnalités endommagées et manquantes (par exemple, la possibilité d'utiliser des codes AE bruts). Utilisez plutôt son pont ObjC; voir -[NSString writeToFile:atomically:encoding:error:].

+0

Nous vous remercions de votre participation. J'ai lu de la documentation, édité ma question et ajouté quelques exemples minimaux. – nwehrle

5

s'il vous plaît essayer

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

oeuvra! Les encodages disponibles sont listés dans la documentation de NSString (voir votre lien)! Enjoy, Michael/Hamburg

+0

Battez-moi! Je publiais juste la même réponse, qui a également fonctionné pour moi. –

+0

Merci. Ça marche bien. Je reverrais la réponse de votre et de foo si j'avais assez de réputation. Ma solution de contournement jusqu'à ce que foo arrive avec ObjC Bridge était d'utiliser node.js et d'utiliser 'encoding': encoding.convert (data, 'UTF-8', 'MACROMAN'); Grüsse aus Zürich nach Hambourg. – nwehrle