# Datei einlesen: Umlaute sind Fragezeichen



## gladiator09 (7. Aug 2009)

hey leute!

ich lese eine datei ein, die einer csv-datei ähnelt (also spalten durch semikolon getrennt)! das funktioniert soweit ganz gut, jedoch bei den umlauten hat er probleme!

alle umlaute werden - nachdem ich sie in die datenbank geschrieben habe - als fragezeichen (?) dargestellt! hab mir das im debugger mal angesehen und ein Ö ist z.b. /ufffd oder sowas in der art!

wie kann ich das machen, dass er mir die umlaute aus der datei normal ausliest bzw. auch dann so in die datenbank speichert?

lg,
alex


----------



## DrZoidberg (7. Aug 2009)

Man kann beim öffnen von Dateien den Zeichensatz angeben, den Java verwenden soll.

z.B. so

[Java]
try {
            BufferedReader reader=new BufferedReader( new InputStreamReader( new FileInputStream("file.txt") , "UTF-8") );
            reader.readLine();
            BufferedWriter writer=new BufferedWriter( new OutputStreamWriter( new FileOutputStream("file.txt") , "UTF-8") );
            writer.write("text");
        } catch(Exception e) {
            e.printStackTrace();
        }
[/Java]

Du kannst dir auch alle verfügbaren Zeichensätze auflisten lassen,.

[Java]
Map<String,Charset>  map=Charset.availableCharsets();
        for(String key: map.keySet()) {
            System.out.println(key);
        }
[/Java]

Allerdings sind nicht alle Zeichensätze auch auf allen Betriebssytemen verfügbar.


----------



## musiKk (7. Aug 2009)

Es gibt hier viele Stellen, an denen Fehler auftreten können: Beim Lesen der Datei, beim Verschicken, beim Empfang in der Datenbank, beim Darstellen über den SQL-Interpreter...
Das Ö hat den Wert \u00D6.

Ich würde erstmal schauen, in welchem Format die CSV-Datei abgespeichert ist. Und auch, was in der Datenbank eingestellt ist.


----------



## gladiator09 (11. Aug 2009)

ok danke erstmal!

ich hab jetzt "UTF-8" angegeben, aber hab immernoch fragezeichen in der datenbank! welchen zeichensatz muss ich nehmen, dass er mir umlaute richtig anzeigt?

lg


----------



## maki (11. Aug 2009)

> welchen zeichensatz muss ich nehmen, dass er mir umlaute richtig anzeigt?


Wie von meinen Vorrednern schon gesagt: Kommt darauf an.

Welchen Zeichensatz hat die CSV Datei?
Welchen Zeichensatz hat die DB?


----------



## ARadauer (11. Aug 2009)

> aber hab immernoch fragezeichen in der datenbank


woher weißt du das? könnte ja sein, dass das ding das dir den inhalt der db anzeigt den fehler macht ;-)


----------



## gladiator09 (11. Aug 2009)

achso ja könnte sein! wo schau ich nach in der DB? ist das die collation?

und wie gesagt, ich hab kein CSV-file... das is ein file ohne endung, das halt wie ein CSV aufgebaut ist! wo kann ich beim file nachschauen?


----------



## musiKk (11. Aug 2009)

Ja ach... DBs gibts viele...

Beim File kannst Du das Encoding nicht nachschauen. Das ist eine Einstellung des Programms, das die Datei erzeugt. Es gibt höchstens einen Fehler, wenn Du eine nicht-UTF-8-Datei als UTF-8 liest. Manchmal, nicht immer. Und ob das nun CSV oder "fast CSV" oder was ganz anderes ist, ist ebenso wie der Dateiname egal.


----------



## gladiator09 (12. Aug 2009)

ja ok, aber was mach ich jetzt?? ich brauch die umlaute...

bzw. das einzige was ich machen könnte ist: die häufigen umlaute wie ß, Ö, ö, Ü, ... durch eine methode ersetzen! aber das ist schon ziemlich hässlich programmiert!

lg


----------



## maki (12. Aug 2009)

> a ok, aber was mach ich jetzt?? ich brauch die umlaute...


zB. die gestellten Fragen beantworten?

So wie du das machst, wird dir hier gar keiner helfen können.


----------



## gladiator09 (12. Aug 2009)

maki hat gesagt.:


> zB. die gestellten Fragen beantworten?
> 
> So wie du das machst, wird dir hier gar keiner helfen können.




ja musikK meinte gerade, dass das im programm eingestellt ist... das kann ich nicht nachschauen, weil ich die datei von meinem mobilfunkanbieter bekomme!

und auf meine frage, was in der DB eingestellt ist bzw. wo ich das nachschaue, habe ich bis jetzt keine antwort bekommen?!


----------



## maki (12. Aug 2009)

> und auf meine frage, was in der DB eingestellt ist bzw. wo ich das nachschaue, habe ich bis jetzt keine antwort bekommen?!


.. und wir sollen raten welche DB du verwendest?

Wie gesagt, so wird das nix...


----------



## gladiator09 (12. Aug 2009)

maki hat gesagt.:


> .. und wir sollen raten welche DB du verwendest?
> 
> Wie gesagt, so wird das nix...



achso, stimmt^^ ms sql server 2005...

ich arbeite mit netbeans und mein projekt ist auf "UTF-8" gestellt!

habs jetzt nochmal getestet und wenn ich es mir im debugger anschau, dann hat die zeile, die ich einlese bei einem umlaut nur ein rechteck oder es steht /ufffd (egal ob Ö oder Ü)!


----------



## maki (12. Aug 2009)

> achso, stimmt^^ ms sql server 2005...


na also, dann wäre das die Collation 



> habs jetzt nochmal getestet und wenn ich es mir im debugger anschau, dann hat die zeile, die ich einlese bei einem umlaut nur ein rechteck oder es steht /ufffd (egal ob Ö oder Ü)!


Aha, da wird es interessant, leider bist du wieder nciht genau genug 

Wenn du sagst "einlese", meinst du dann das lesen einer Datei (zB. mit BufferedReader)?
Wenn ja, solltest du den Zeichensatz mitangeben, arbeitest du unter Windows?

Zeig doch mal den Code der die Datei einliest...


----------



## gladiator09 (12. Aug 2009)

maki hat gesagt.:


> na also, dann wäre das die Collation
> 
> 
> Aha, da wird es interessant, leider bist du wieder nciht genau genug
> ...



collation: SQL_Latin1_General_CP1_CI_AS

ich arbeite unter windows!

jawoll, ich lese es mit einem bufferedreader ein! habs jetzt umgeschrieben, dass ich einen stream verwende, hatte vorher einen Reader (FileReader)!


```
File[] ordner = new File(".").listFiles(); // Ordner in Array schreiben

            // alle EMIL-Files einlesen
            for(int i = 0; i < ordner.length; i++)
            {
                File f = ordner[i]; // Gerade zubehandelnde Datei in 'f' schreiben

                if(f.getName().startsWith("EML")) // nur wenn EMIL-File
                {
                    // EMIL-File einlesen - Anfang
                    r = new BufferedReader(new InputStreamReader(new FileInputStream(f), "UTF-8")); // öffnen des EMIL-Files

                    while((zeile = r.readLine()) != null) // ganzes EMIL-File durchgehen
                    {
                        try
                        {
                            getrennt = zeile.split(";"); // zeile trennen
                            if(getrennt[0].equals("100"))
                            {
                                date = getSQLDate(getrennt[3]); // Timestamp vom Datum erzeugen
                                rnummer = getrennt[1];
                            }
.
.
.
```


----------



## maki (12. Aug 2009)

Welchen Datentyp hat denn das Feld in der DB?


----------



## gladiator09 (12. Aug 2009)

maki hat gesagt.:


> Welchen Datentyp hat denn das Feld in der DB?



varchar(100) mit SQL_Latin1_General_CP1_CI_AS

aber glaubst du dass es an der DB liegt, wenns beim debuggen schon falsch in der variable steht?

EDIT: bin gerade draufgekommen, dass ich eine tabelle "mitarbeiter" habe und da gibt es nachnamen, die umlaute drin haben (die namen kommen aus einer anderen DB) und die kann die datenbank einwandfrei darstellen!


----------



## gladiator09 (13. Aug 2009)

gladiator09 hat gesagt.:


> varchar(100) mit SQL_Latin1_General_CP1_CI_AS
> 
> aber glaubst du dass es an der DB liegt, wenns beim debuggen schon falsch in der variable steht?
> 
> EDIT: bin gerade draufgekommen, dass ich eine tabelle "mitarbeiter" habe und da gibt es nachnamen, die umlaute drin haben (die namen kommen aus einer anderen DB) und die kann die datenbank einwandfrei darstellen!



hat echt keiner mehr eine ahnung? bräuchte das wirklich dringend!


----------



## HannsW (13. Aug 2009)

Ich habe ein ähnlichres Problem, das ich wie folgt gelöst habe;
	
	
	
	





```
public static String asciiDecode(StringBuffer input) {
		char c;
		StringBuffer filtered = new StringBuffer(input.length());
		for (int i = 0; i < input.length(); i++) {
			c = input.charAt(i);
			switch (c) {
			// ä
			case 8222:
				filtered.append("ä");
				break;
			// Ä
			case 381:
				filtered.append("Ä");
				break;

			// ö
			case 8221:
				filtered.append("ö");
				break;

			// Ö
			case 8482:
				filtered.append("Ö");
				break;

			// ü
			case 129:
				filtered.append("ü");
				break;

			// Ü
			case 353:
				filtered.append("Ü");
				break;

			// ß
			case 225:
				filtered.append("ß");
				break;

			// ³
			case 252:
				filtered.append("³");
				break;

			// ²
			case 253:
				filtered.append("²");
				break;

			// µ
			case 230:
				filtered.append("µ");
				break;

			// ~
			case 126:
				filtered.append("~");
				break;

			default:
				filtered.append(c);
				break;
			}

		}
		// System.out.println (filtered.toString());
		return (filtered.toString());
	}
```

hth
Hanns


----------



## gladiator09 (14. Aug 2009)

ok danke, aber hab das gerade getestet und im debugger angesehen! bei mir hat der Char, der der umlaut "sein sollte" einen wert von \ufffd und keine zahl wie z.B. 8222 für "ä"... deshalb funktioniert das leider nicht!

sonst noch ideen?

lg


----------



## HannsW (14. Aug 2009)

gladiator09 hat gesagt.:


> ok danke, aber hab das gerade getestet und im debugger angesehen! bei mir hat der Char, der der umlaut "sein sollte" einen wert von \ufffd und keine zahl wie z.B. 8222 für "ä"... deshalb funktioniert das leider nicht!
> 
> sonst noch ideen?
> 
> lg


Ja, dann setzt Du eben /Ufffd ein, bzw die Werte, die Du brauchst.
8222 ist eine int, und wie stellt man Hex-zahlen dar? und was bedeutet das "/u" vor dem "ffd" ?
Kann Dien HexEditor verscheidene Zahlensysteme darstellen?


----------



## Aske (14. Aug 2009)

Wenn Du diese csv ähnliche Datei mit dem Windows Editor öffnest (nicht Wordpad, sondern der ganz billige Editor) und "speichern unter" wählst, was steht dann da unter der Spalte "Codierung" eingetragen?


----------



## gladiator09 (17. Aug 2009)

HannsW hat gesagt.:


> Ja, dann setzt Du eben /Ufffd ein, bzw die Werte, die Du brauchst.
> 8222 ist eine int, und wie stellt man Hex-zahlen dar? und was bedeutet das "/u" vor dem "ffd" ?
> Kann Dien HexEditor verscheidene Zahlensysteme darstellen?



ich hab das mal gestestet und er stellt das "Ü" ebenfalls mit /ufffd da! und zwar deswegen, weil es im debugger schon ein quadratisches kästchen ist...



> Wenn Du diese csv ähnliche Datei mit dem Windows Editor öffnest (nicht Wordpad, sondern der ganz billige Editor) und "speichern unter" wählst, was steht dann da unter der Spalte "Codierung" eingetragen?



ANSI


----------



## gladiator09 (17. Aug 2009)

so leute, der tipp mit der codierung im editor war super! habs jetzt mal gegoogelt und bei der ANSI-codierung muss die datei mit dem ISO-8859-1 zeichensatz eingelesen werden!

funktioniert jetzt, dass er die umlaute übernimmt 

danke euch allen für eure hilfe!

lg

P.S.: für die leute, die das gleiche problem haben:


```
// alle EMIL-Files einlesen
            for(int i = 0; i < ordner.length; i++)
            {
                File f = ordner[i]; // Gerade zubehandelnde Datei in 'f' schreiben

                if(f.getName().startsWith("EML")) // nur wenn EMIL-File
                {
                    // EMIL-File einlesen - Anfang
                    r = new BufferedReader(new InputStreamReader(new FileInputStream(f), "ISO-8859-1")); // öffnen des EMIL-Files

                    while((zeile = r.readLine()) != null) // ganzes EMIL-File durchgehen
                    {
                        try
                        {
                            getrennt = zeile.split(";"); // zeile trennen
```


----------

