Envoyé par : Thunderseb
Date : 08/05/2008 13:58
Bonjour à tous,
Je suis en train de faire une petite application en XULRunner, et cette application peut servir à ouvrir, lite et modifier des fichiers XML. Jusque là, pas de problème. Le problème c'est que les fichiers sont en UTF-8, et qu'ils ne sont pas chargés sous cet encodage. Tous les caractères spéciaux sont tronqués. Les fichiers de l'application sont tous en UTF-8 donc le problème ne peut venir que de la lecture des fichiers.
Donc la question est, comment lire avec le charset UTF-8 ? J'ai trouvé ceci, http://developer.mozilla.org/en/docs/Reading_textual_data, sur MDC mais ça ne semble pas marcher.
J'ai XULRunner 1.8, et ma fonction de lecture est celle-ci (elle provient aussi de MDC si je me souvient bien) :
var data = ""; var fstream = Components.classes["@mozilla.org/network/file-input-stream;1"].createInstance(Components.interfaces.nsIFileInputStream); var sstream = Components.classes["@mozilla.org/scriptableinputstream;1"].createInstance(Components.interfaces.nsIScriptableInputStream); fstream.init(url, -1, 0, 0); sstream.init(fstream); var str = sstream.read(4096); while (str.length > 0) { data += str; str = sstream.read(4096); } sstream.close(); fstream.close(); return data;
Voilà, si vous avez une idée de comment faire, je suis preneur :) Merci.
Envoyé par : Raphael
Date : 09/05/2008 14:15
Perso, j'utilise simplement un fichier io.js qui s'occupe de lire et d'écrire, assez simplement en passant en paramètre "utf-8" ça marche très bien. J'ai récupéré ça sur Mozillazine je crois. Ca marche du tonnerre pour lire et écrire du XML en UTF-8 sous Ubuntu par exemple.
io.js
///////////////////////////////////////////////// ///////////////////////////////////////////////// // // Basic JavaScript File and Directory IO module // By: MonkeeSage, v0.1 // ///////////////////////////////////////////////// ///////////////////////////////////////////////// if (typeof(JSIO) != 'boolean') { var JSIO = true; ///////////////////////////////////////////////// // Basic file IO object based on Mozilla source // code post at forums.mozillazine.org ///////////////////////////////////////////////// // Example use: // var fileIn = FileIO.open('/test.txt'); // if (fileIn.exists()) { // var fileOut = FileIO.open('/copy of test.txt'); // var str = FileIO.read(fileIn); // var rv = FileIO.write(fileOut, str); // alert('File write: ' + rv); // rv = FileIO.write(fileOut, str, 'a'); // alert('File append: ' + rv); // rv = FileIO.unlink(fileOut); // alert('File unlink: ' + rv); // } var FileIO = { localfileCID : '@mozilla.org/file/local;1', localfileIID : Components.interfaces.nsILocalFile, finstreamCID : '@mozilla.org/network/file-input-stream;1', finstreamIID : Components.interfaces.nsIFileInputStream, foutstreamCID : '@mozilla.org/network/file-output-stream;1', foutstreamIID : Components.interfaces.nsIFileOutputStream, sinstreamCID : '@mozilla.org/scriptableinputstream;1', sinstreamIID : Components.interfaces.nsIScriptableInputStream, suniconvCID : '@mozilla.org/intl/scriptableunicodeconverter', suniconvIID : Components.interfaces.nsIScriptableUnicodeConverter, open : function(path) { try { var file = Components.classes[this.localfileCID] .createInstance(this.localfileIID); file.initWithPath(path); return file; } catch(e) { return false; } }, read : function(file, charset) { try { var data = new String(); var fiStream = Components.classes[this.finstreamCID] .createInstance(this.finstreamIID); var siStream = Components.classes[this.sinstreamCID] .createInstance(this.sinstreamIID); fiStream.init(file, 1, 0, false); siStream.init(fiStream); data += siStream.read(-1); siStream.close(); fiStream.close(); if (charset) { data = this.toUnicode(charset, data); } return data; } catch(e) { return false; } }, write : function(file, data, mode, charset) { try { var foStream = Components.classes[this.foutstreamCID] .createInstance(this.foutstreamIID); if (charset) { data = this.fromUnicode(charset, data); } var flags = 0x02 | 0x08 | 0x20; // wronly | create | truncate if (mode == 'a') { flags = 0x02 | 0x10; // wronly | append } foStream.init(file, flags, 0664, 0); foStream.write(data, data.length); // foStream.flush(); foStream.close(); return true; } catch(e) { return false; } }, create : function(file) { try { file.create(0x00, 0664); return true; } catch(e) { return false; } }, unlink : function(file) { try { file.remove(false); return true; } catch(e) { return false; } }, path : function(file) { try { return 'file:///' + file.path.replace(/\\/g, '\/') .replace(/^\s*\/?/, '').replace(/\ /g, '%20'); } catch(e) { return false; } }, toUnicode : function(charset, data) { try{ var uniConv = Components.classes[this.suniconvCID] .createInstance(this.suniconvIID); uniConv.charset = charset; data = uniConv.ConvertToUnicode(data); } catch(e) { // foobar! } return data; }, fromUnicode : function(charset, data) { try { var uniConv = Components.classes[this.suniconvCID] .createInstance(this.suniconvIID); uniConv.charset = charset; data = uniConv.ConvertFromUnicode(data); // data += uniConv.Finish(); } catch(e) { // foobar! } return data; } } ///////////////////////////////////////////////// // Basic Directory IO object based on JSLib // source code found at jslib.mozdev.org ///////////////////////////////////////////////// // Example use: // var dir = DirIO.open('/test'); // if (dir.exists()) { // alert(DirIO.path(dir)); // var arr = DirIO.read(dir, true), i; // if (arr) { // for (i = 0; i < arr.length; ++i) { // alert(arr[i].path); // } // } // } // else { // var rv = DirIO.create(dir); // alert('Directory create: ' + rv); // } // --------------------------------------------- // ----------------- Nota Bene ----------------- // --------------------------------------------- // Some possible types for get are: // 'ProfD' = profile // 'DefProfRt' = user (e.g., /root/.mozilla) // 'UChrm' = %profile%/chrome // 'DefRt' = installation // 'PrfDef' = %installation%/defaults/pref // 'ProfDefNoLoc' = %installation%/defaults/profile // 'APlugns' = %installation%/plugins // 'AChrom' = %installation%/chrome // 'ComsD' = %installation%/components // 'CurProcD' = installation (usually) // 'Home' = OS root (e.g., /root) // 'TmpD' = OS tmp (e.g., /tmp) var DirIO = { sep : '/', dirservCID : '@mozilla.org/file/directory_service;1', propsIID : Components.interfaces.nsIProperties, fileIID : Components.interfaces.nsIFile, get : function(type) { try { var dir = Components.classes[this.dirservCID] .createInstance(this.propsIID) .get(type, this.fileIID); return dir; } catch(e) { return false; } }, open : function(path) { return FileIO.open(path); }, create : function(dir) { try { dir.create(0x01, 0664); return true; } catch(e) { return false; } }, read : function(dir, recursive) { var list = new Array(); try { if (dir.isDirectory()) { if (recursive == null) { recursive = false; } var files = dir.directoryEntries; list = this._read(files, recursive); } } catch(e) { // foobar! } return list; }, _read : function(dirEntry, recursive) { var list = new Array(); try { while (dirEntry.hasMoreElements()) { list.push(dirEntry.getNext() .QueryInterface(FileIO.localfileIID)); } if (recursive) { var list2 = new Array(); for (var i = 0; i < list.length; ++i) { if (list[i].isDirectory()) { files = list[i].directoryEntries; list2 = this._read(files, recursive); } } for (i = 0; i < list2.length; ++i) { list.push(list2[i]); } } } catch(e) { // foobar! } return list; }, unlink : function(dir, recursive) { try { if (recursive == null) { recursive = false; } dir.remove(recursive); return true; } catch(e) { return false; } }, path : function (dir) { return FileIO.path(dir); }, split : function(str, join) { var arr = str.split(/\/|\\/), i; str = new String(); for (i = 0; i < arr.length; ++i) { str += arr[i] + ((i != arr.length - 1) ? join : ''); } return str; }, join : function(str, split) { var arr = str.split(split), i; str = new String(); for (i = 0; i < arr.length; ++i) { str += arr[i] + ((i != arr.length - 1) ? this.sep : ''); } return str; } } if (navigator.platform.toLowerCase().indexOf('win') > -1) { DirIO.sep = '\\'; } }
En espérant que ça te serve :)
Envoyé par : Thunderseb
Date : 11/05/2008 10:49
Okay merci, je vais tester ça :) .
Il n'est plus possible de poster des messages dans ce forum.
Copyright © 2003-2013 association xulfr, 2013-2016 Laurent Jouanneau - Informations légales.
Mozilla® est une marque déposée de la fondation Mozilla.
Mozilla.org™, Firefox™, Thunderbird™, Mozilla Suite™ et XUL™
sont des marques de la fondation Mozilla.