D2NT text file Charset Problem

12/02/2011 19:58 exilotus#1
Hallo,
ich arbeite gerade an einem Mule Item Manager in java, beim auslesen des Itemlogs stoße ich allerdings auf ein Problem.

Nach jedem Zeichen ist nochmals ein whitespace (siehe bild). Dieses Problem tritt bei jeder von mir getesteten d2nt version auf mit der ich text in eine file schreibe.

z.B.
file.WriteLine(item.itemtype);
file.WriteLine(item.quality);
file.WriteLine(removeColor(item.itemdesc));

Meine Versuche mit dem InputStreamReader die file mit diversen charsets zu öffnen blieb erfolglos. :mad:

Hat jemand eine Idee wo der Fehler liegen könnte? :confused:
bzw. einen Lösungsansatz?

Wenn ich die textfile mit notepad++ öffne und zu ANSI codiere funktioniert es.

mfg exi
12/03/2011 00:21 sataan1337#2
Moin

wenn du mal eine Beispiel-Logdatei und ein Java-Codesnippet hochlädst lässt sich der Fehler eventuell eher ausfindig machen ;)

ich bastel gerade an nem ähnlichen Projekt für die Hochschule und werde mich dabei auf Muddy's D2NT beschränken. Um die Pickit-Logs einzulesen hatte ich vor geraumer Zeit schonmal was angefangen dass die XML-Logs in ne relationale Datenbank packt, an dem code der diese XML-Logs erstellt könntest da sicherlich ansetzen, die lassen sich in java vernünftig auslesen. (und xml ist nebenbei noch wesentlich schöner ^^)
Die Dateien die dabei für den Mule-Manager geschrieben werden hab ich leider auch noch nicht wirklich lesbar codiert bekommen, ich hatte an der Stelle angenommen die kryptischen Sonderzeichen hätten eventuell was mit den Farbcodes zu tun

pS.: in deinem Screenshot find ich grad den Fehler nicht ^^
12/03/2011 02:05 exilotus#3
java item log einlesen:

Code:
in = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
do
{
	line = in.readLine();
	//System.out.println(line);
	
	if(line != null)
	{
		if(!line.contains("Unidentified"))
		{
			if(line.startsWith(" "))
				line = line.replaceFirst(" ", "");
			content.add(line);
		}
	}
}
while(line != null);
[Only registered and activated users can see links. Click Here To Register...]
Ausgabe so wie der d2nt es in die text file schreibt.
[Only registered and activated users can see links. Click Here To Register...]
Ausgabe nachdem ich die text file im notepad++ zu ANSI konvertiert habe (Kodierung-> Konvertieren zu ANSI).
Wie man sieht ist die Nicht ANSI konvertierte version doppelt so groß was sich durch die zusätlichen whitespaces erklärt.

Im Anhang findet ihr noch die beiden Item Logs sowie gepackt in einer .zip da die text files vll beim speicher/upload vorgang verändert werden könnten.

js code vom d2nt
Code:
function NTU_TLInventory() {
	NTConfig_TLInventory_SkipEquipped   = true;         // true = just log stash and inventory
	NTConfig_TLInventory_Delimeter      = "-";            // output file delimiter - see function TTL_WriteIt()
	NTConfig_TLInventory_SortOrder      = "QUALITY|TYPE|CLASS|NAME";
	
	Print(COLOR_3 + "[Toothless Inventory] - Load");
   
	TLI_DoIt();
	Print ("Finished");
}
function TLI_DoIt(verbose) {
	Print ("Attempting to log inventory ...");
   
   	if(arguments.length < 1)
		var verbose = false;
		
	var items = me.GetItems();
	items.sort(function(a, b){
		var nameA=a.name.toLowerCase(), nameB=b.name.toLowerCase()
		if (nameA < nameB) //sort string ascending
			return -1
		if (nameA > nameB)
			return 1
		return 0 //default return value (no sorting)
	});
	var logged = new Array();
	if (items) {
		for(var i = 0 ; i < items.length ; i++) {
			item = items[i];
			ignore = _NTT_IgnoredItems.join("-");
			ignore += "-box";
         
			if(ignore.indexOf(item.code) == -1) {
				if(!NTConfig_TLInventory_SkipEquipped)
					logged.push(item);
				else if (item.mode == 0)
					logged.push(item);
			}
		}
		if (logged.length) {
			var fileName = "logs/" + me.account + "." + me.name + ".txt";
			_file = FileOpen(fileName, 1);
			if (_file) {
				for (var i = 0; i < logged.length; i++)
					TLI_LogItem(_file, logged[i], verbose);
				_file.Close();
				Print (COLOR_2 + logged.length + " items written to - " + fileName + " -");
			}
			else
				Print(COLOR_1 + "Unable to write file to - " + fileName);
		}
		else
			Print(COLOR_1 + "No items on this character to log");
	}
	else
		Print(COLOR_1 + "No items on this character to log");
}
function TLI_LogItem(file, item, verbose) 
{
	var UNIDtext = "";
	
	if (!(item.itemflag & 0x10)) 
	{
		for (var qual in _NTIPAliasQuality) 
		{
			if (_NTIPAliasQuality[qual]==item.quality) UNIDtext+=qual.charAt(0).toUpperCase() + qual.substr(1) + "/";
		}
		
		var s = item.itemdesc;
		s = s.replace(REGEX6, REPLACE6); 
		var def = s.match(/.*(Defense: \d+).*/);
		
		if (def!=null) 
		{
			def[0] = def[0].replace(/Defense:/,"Def");
			UNIDtext += def[0]+"/";
		}
		
		UNIDtext += "Unidentified";
		if (item.itemflag & 0x400000) UNIDtext+="/Ethereal";
			file.WriteLine(UNIDtext);
	}
	else
	{
		file.WriteLine(item.itemtype);
		file.WriteLine(item.quality);
		file.WriteLine(removeColor(item.itemdesc));
		file.WriteLine("NEXT_ITEM");
	}
}

function removeColor(s)
{
	s = s.replace(REGEX6, REPLACE6);
	return s;
}
mfg exi

Edit:
habe gerade nochmal ein test durchgeführt und anscheint liegt es Nicht an Java. Da c++ die gleichen whitespace probleme hat.
[Only registered and activated users can see links. Click Here To Register...]
Code:
#include <cstdlib>
#include <iostream>
#include <fstream>

using namespace std;

int main(int argc, char *argv[])
{
    ifstream f;
    string s;
    f.open("test-log.txt", ios::in);
    while (!f.eof())
    {
        getline(f, s);
        cout << s << endl;
    }
    f.close();
    
    system("PAUSE");
    return EXIT_SUCCESS;
}
Gibt es vll jemanden der dieses Problem schonmal hatte? :) vll muddy bei seinem mule manager?
12/03/2011 10:54 Muddy Waters#4
In dem Fall würde ich vermuten, dass dein InputStreamReader Objekt einfach von Haus aus ANSI Kodierung erwartet. Sollte sich aber eigentlich ändern lassen, indem du dem InputStreamReader Objekt bei der Instantiierung einfach mitteilst, welche Zeichenkodierung du verwenden möchtest (in dem Fall UTF-16LE i.e. UCS-2 Little Endian).

Bei meinem Mule Manager hatte ich das Problem nicht, da die StreamReader Klasse in C# von Haus aus UTF-8 einliest. Da UTF-8 und UCS-2 in der Praxis gleich sind, funktionierte bei mir alles auf Anhieb - C# ist eben toll. :p

LG
Muddy
12/03/2011 11:39 exilotus#5
Vielen dank @muddy
Standart charset war 8859-1 und nach umstellung auf utf-16(ohne le) funktioniert es einwandfrei. :)
Was mich eigentlich wundert, denn soweit mir bekannt ist, codiert java strings intern als utf-16, weshalb ich nur utf-8 getestet habe. ( UTF-8 funktionierte bei mir unter java NICHT ) :rolleyes:

Code:
in = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-16"));
/close plz