Forums : Xul, Xbl, JS...

Aller à la discussion :  Plus récente Plus ancienne

# [XULRunner] Lecture de fichier en utf-8

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.

# Re: [XULRunner] Lecture de fichier en utf-8

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 :)

# Re: [XULRunner] Lecture de fichier en utf-8

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.