Textcodierung.. es ist zum Haareausraufen
Holger
- java
0 Axel Richter0 Felix0 Axel Richter0 Felix
Morgen!!
Weil ich verschiedene Schriftsätze benutze, maskiere ich meine Texte und speichere reine Ascii daten. So sieht das dann aus:\u308f\u305f\u3057
Wenn ich es z.B. so ein ein JLabel schreibe, dann wird es auch korreckt interpretiert und ich bekomme die gewünschten Zeichen zu sehen.
Wenn ich aber die Daten aus der Textdatei auslese und dann in das JLabelpacke, dann werden die Zeichen auch geneu so wiedergegeben, wie ich sie in der datei stehen hatte. Aber in der String Variablen müsste doch genau das gleiche stehen wie vorher, alsich es direkt in die Variable geschrieben habe. Warum werden die Zeichen nicht mehr interpretiert?? Das entzieht sich völlig meinem Verständnis.
Holger
Hallo,
Weil ich verschiedene Schriftsätze benutze, maskiere ich meine Texte und speichere reine Ascii daten. So sieht das dann aus:\u308f\u305f\u3057
Wenn ich es z.B. so ein ein JLabel schreibe, dann wird es auch korreckt interpretiert und ich bekomme die gewünschten Zeichen zu sehen.
Wenn ich aber die Daten aus der Textdatei auslese und dann in das JLabelpacke, dann werden die Zeichen auch geneu so wiedergegeben, wie ich sie in der datei stehen hatte. Aber in der String Variablen müsste doch genau das gleiche stehen wie vorher, alsich es direkt in die Variable geschrieben habe. Warum werden die Zeichen nicht mehr interpretiert?? Das entzieht sich völlig meinem Verständnis.
Wie entsteht die Textdatei? Wie liest Du die Textdatei aus?
So sollte sie entstehen:
http://java.sun.com/j2se/1.4.1/docs/api/java/io/DataOutputStream.html
writeUTF(java.lang.String)
So solltest Du sie auslesen:
http://java.sun.com/j2se/1.4.1/docs/api/java/io/DataInputStream.html
readUTF()
import java.io.*;
class UTFWriteRead {
public static void main(String[] args) {
FileOutputStream file_out;
DataOutputStream data_out;
FileInputStream file_in;
DataInputStream data_in;
try {
file_out = new FileOutputStream("test.txt");
data_out = new DataOutputStream(file_out);
String c = "abc";
String d = "\u308f\u305f\u3057";
data_out.writeUTF(c);
data_out.writeUTF(d);
data_out.flush();
data_out.close();
} catch (IOException e) {
System.out.println(e);
}
try {
file_in = new FileInputStream("test.txt");
data_in = new DataInputStream(file_in);
String str = data_in.readUTF();
System.out.println("UTF String" + str);
str = data_in.readUTF();
System.out.println("UTF String" + str);
} catch (IOException e) {
System.out.println(e);
}
}
}
viele Grüße
Axel
String str = data_in.readUTF();
System.out.println("UTF String" + str);
str = data_in.readUTF();
System.out.println("UTF String" + str);
data_in.readUTF() muss ich zweimal ausführen, um den Zeiger zu verschieben? Wie werden denn die beiden Datensätze auseinander gehalten. Das Programm fruchtet ja so einwandfrei, nur möchte ich die Datei nich generieren lassen. Ich möchte sie per Hand schreiben.
Und mir leutet immernoch nicht ein warum er exakt gleiche String nämlich "\u308f\u305f\u3057" verschieden bahandelt wird, nur weil er einmal aus der Datei kommt und einmal nicht. Das ist doch völlig unlogisch. bei einer System.out.println kann man sehen, dass die Daten gleich sind, auf meiner Grafischen Oberfläche aber nicht.
Bisher habe ich die Datei so geholt:
BufferedReader f;
String line;
int i=0;
try
{
i=0;
f = new BufferedReader(new FileReader( "DATA/bla.txt"));
while ((line = f.readLine()) != null )
{ String2 = line }
f.close();
}
catch (IOException e)
{
System.out.println("Fehler beim Lesen der Datei");
}
Und wie gesagt "\u308f\u305f\u3057" steht in der Datei "\u308f\u305f\u3057" steht auch später in String2 und dennoch ist das Verhalten anders....
Hallo,
data_in.readUTF() muss ich zweimal ausführen, um den Zeiger zu verschieben? Wie werden denn die beiden Datensätze auseinander gehalten.
http://java.sun.com/j2se/1.4.1/docs/api/java/io/DataOutputStream.html
writeUTF(java.lang.String)
First, two bytes are written to the output stream as if by the writeShort method giving the number of bytes to follow. This value is the number of bytes actually written out, not the length of the string. Following the length, each character of the string is output, in sequence, using the UTF-8 encoding for the character.
http://java.sun.com/j2se/1.4.1/docs/api/java/io/DataInput.html
#readUTF()
First, two bytes are read and used to construct an unsigned 16-bit integer in exactly the manner of the readUnsignedShort method . This integer value is called the UTF length and specifies the number of additional bytes to be read. These bytes are then converted to characters by considering them in groups. The length of each group is computed from the value of the first byte of the group. The byte following a group, if any, is the first byte of the next group.
Das Programm fruchtet ja so einwandfrei, nur möchte ich die Datei nich generieren lassen. Ich möchte sie per Hand schreiben.
Da kann ich Dir nicht helfen. Eventuell weiß ja jemand anders noch was. Das Problem ist: Wie bekommt man eine Datei, die mit .readUTF() ausgelesen werden kann?
Und mir leutet immernoch nicht ein warum er exakt gleiche String nämlich "\u308f\u305f\u3057" verschieden bahandelt wird, nur weil er einmal aus der Datei kommt und einmal nicht. Das ist doch völlig unlogisch.
Nö. Es ist nicht der gleiche String.
String s = "\u308f\u305f\u3057";
Hier wird durch den Compiler UTF-Codiert. Der String ist drei UTF-Zeichen lang.
Wie hier:
char data[] = {'\u308f', '\u305f', '\u3057'};
String s = new String(data);
Beim Einlesen mit BufferedReader.readLine() passiert folgendes:
char data[] = {'\', 'u', '3', '0', '8', 'f', '\'...};
String s = new String(data);
Der String ist 18 Zeichen lang.
viele Grüße
Axel
String s = "\u308f\u305f\u3057";
Hier wird durch den Compiler UTF-Codiert. Der String ist drei UTF-Zeichen lang.
Aha, OK kann ich diese Codierung auch nachträglich nach Programmstart erreichen? Dann wäre ja alles OK.
Danke für die gute Erklärung!
Gruß
Felix