XML, UTF-8, JDOM und Umlaute

Status
Nicht offen für weitere Antworten.
Hallo,

ich nutze JDOM, um XML-Code in Dateien zu schreiben. Ich habe als Kodierung UTF-8 angegeben, weil mein Programm auch mit russischen, griechischen, koreanischen, chinesischen und japanischen Texten umgehen können muss. Leider werden deutsche Umlaute dann natürlich wie bei HTML umkodiert (z.B. ü in [noparse]ü[/noparse]). Einigen Forenbeiträgen habe ich entnommen, dass es keine Probleme gibt, wenn man den Zeichensatz auf ISO-8859-1 ändert, aber das kommt wegen der anderen Sprachen nicht in Frage.

Meine Frage lautet daher: Wenn UTF-8 doch eigentlich mehr als eine Million Zeichen darstellen kann und in die XML-Dateien selbst irgendwelche kyrillischen oder koreanischen Zeichen eingebaut werden können (d.h. ohne Umkodierung), warum müssen dann einfache deutsche Umlaute umkodiert werden? Ich meine, im Zeichensatz sind sie doch alle drin, genau so wie die kyrillischen oder koreanischen Zeichen?!
 

musiKk

Top Contributor
Also ich kenne mich mit JDOM im Speziellen vielleicht nicht aus, aber schon
Leider werden deutsche Umlaute dann natürlich wie bei HTML umkodiert (z.B. ü in ü).
kann ich nicht nachvollziehen. Deutsche Umlaute haben keine Sonderstellung im Vergleich zu anderen Zeichen.

Vielleicht kannst Du mal ein kleines Code-Beispiel bringen, in dem das Problem deutlich wird.
 
Sorry wegen der späten Antwort!

OK, das Problem habe ich scheinbar nur, weil ich die Daten aus einer JEditorPane nehme, die mit HTML arbeitet...

Mein Problem: Wenn ich normale Umlaute oder auch fernöstliche Schriftzeichen in eine solche JEditorPane einfüge und dann wieder auslese (z.B. um sie in eine XML-Datei auszugeben), wie kann ich die HTML-kodierten Zeichen dann wieder in UTF-8 zurückkonvertieren?

Hier ein Minimalbeispiel:

Java:
import java.io.*;
import javax.swing.*;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.output.XMLOutputter;
import org.jdom.output.Format;

public class XmlBeispiel {
	
	public XmlBeispiel() {
		String umlaute = "Umlaute: ä, ö, ü, ß";
		
		JEditorPane editorPane = new JEditorPane();
		editorPane.setContentType("text/html");
		editorPane.setText(umlaute);
		String htmlString = editorPane.getText();
		String ohneHtml = htmlString.replaceAll("</?\\w++[^>]*+>", "");
		
		Element root = new Element("root");
		Document document = new Document(root);
		Element element = new Element("element");
		element.setText(ohneHtml);
		root.addContent(element);
		try {
			FileOutputStream outStream = new FileOutputStream("output.xml");
			XMLOutputter outToFile = new XMLOutputter();
			Format format = Format.getPrettyFormat();
			format.setEncoding("utf-8");
			outToFile.setFormat(format);
			outToFile.output(document, outStream);
			outStream.flush();
			outStream.close();
		} catch (IOException e) {
			System.out.println("Cannot save:" + e.getMessage());
		}
	}
	
	public static void main (String[] args) {
		new XmlBeispiel();
	}
}

In diesem Beispiel sind die Umlaute in der resultierenden Datei "output.xml" alle HTML-kodiert.

Ich kann mir doch nicht für jedes mögliche Zeichen auf dieser Welt eine regex bauen, um das wieder hinzubiegen?!
 
Na gut, ich habe jetzt ein bisschen hin- und herprobiert und die Lösung selbst gefunden. War eine ziemlich fiese Angelegenheit - ein Wunder, dass ich das so schnell hingekriegt habe... Hier die Details der Lösung für alle Interessierten:

Bisher hatte ich die HTML-Datei mit einem regulären Ausdruck von den HTML-Tags befreit, ohne aber die Sonderzeichen entsprechend zurückzukonvertieren. Was auch schwierig wäre bei mehr als einer Million möglichen Zeichen... Das war also in Zeile 17:
[JAVA=17]String ohneHtml = htmlString.replaceAll("</?\\w++[^>]*+>", "");[/code]

Diese habe ich ausgetauscht gegen den Swing-HTML-Parser. Dieser wird meistens in Kombination mit einem FileReader verwendet, aber ich habe stattdessen einen StringReader eingebaut. Zeile 17 des vorherigen Posts muss also durch folgenden Code ersetzt werden, um alle HTML-Zeichen passend zurückzukonvertieren:

[JAVA=17]
HTMLEditorKit.ParserCallback callback = new HTMLEditorKit.ParserCallback () {
public void handleText(char[] data, int pos) {
ohneHtml = String.valueOf(data);
}
};
Reader reader = new StringReader(htmlString);
try {
new ParserDelegator().parse(reader, callback, false);
} catch (IOException ioe) {
System.out.println(ioe);
}
[/code]

Natürlich muss man die entsprechenden Importe einbauen und den String "ohneHtml" als Klassenvariable definieren.

Hier ist zwecks Copy & Paste noch mal der gesamte Code:

Java:
import java.io.*;
import javax.swing.*;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.output.XMLOutputter;
import org.jdom.output.Format;
import javax.swing.text.html.*;
import javax.swing.text.html.parser.ParserDelegator;

public class XmlBeispiel {
	
	String ohneHtml;
	
	public XmlBeispiel() {
		String umlaute = "Umlaute: ä, ö, ü, ß";
		
		JEditorPane editorPane = new JEditorPane();
		editorPane.setContentType("text/html");
		editorPane.setText(umlaute);
		String htmlString = editorPane.getText();
		
		HTMLEditorKit.ParserCallback callback = new HTMLEditorKit.ParserCallback () {
		    public void handleText(char[] data, int pos) {
		        ohneHtml = String.valueOf(data);
		    }
		};
		Reader reader = new StringReader(htmlString);
		try {
			new ParserDelegator().parse(reader, callback, false);
		} catch (IOException ioe) {
			System.out.println(ioe);
		}
		
		Element root = new Element("root");
		Document document = new Document(root);
		Element element = new Element("element");
		element.setText(ohneHtml);
		root.addContent(element);
		try {
			FileOutputStream outStream = new FileOutputStream("output.xml");
			XMLOutputter outToFile = new XMLOutputter();
			Format format = Format.getPrettyFormat();
			format.setEncoding("utf-8");
			outToFile.setFormat(format);
			outToFile.output(document, outStream);
			outStream.flush();
			outStream.close();
		} catch (IOException e) {
			System.out.println("Cannot save:" + e.getMessage());
		}
	}
	
	public static void main (String[] args) {
		new XmlBeispiel();
	}
}

Ich habe es auch mit koreanischen Zeichen getestet. Läuft so weit gut.
 
Zuletzt bearbeitet:
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
B JDom + Umlaute XML & JSON 2
P JDOM oder SAX XML & JSON 3
Hijo2006 Grundsätzliches zu JDOM 2.x XML & JSON 1
W Kindelemente mit JDOM eines bestimmten Attributes auslesen XML & JSON 6
S JDOM XML Datei darstellen Fehler! XML & JSON 2
S JDom XML ein Element hinzufügen. XML & JSON 1
C JDOM: Value ohne Unterelemente auslesen XML & JSON 1
Z XML Datei mit JDOM einlesen und verarbeiten XML & JSON 6
J JDOM XMLOutputter getPrettyFormat() XML & JSON 3
H JDOM setAttribute Reihenfolge XML & JSON 3
B XML aus einer URL im Internet lesen (JDOM) XML & JSON 4
F Aus XML mit JDOM aus Elementattributen Werte rauslesen XML & JSON 4
R sax, stax, jdom, jaxb? List von Objekten speichern und laden XML & JSON 6
C xml validierung gegen xsd mit jdom: Fehlermeldung Cannot find the declaration of element ... XML & JSON 8
T Dom, Jdom, Sax XML & JSON 8
Helgon MalformedByteSequenceException und null JDOM Attribute XML & JSON 5
Helgon JDOM schreibt nicht XML & JSON 2
A XSl mit JDom auslesen XML & JSON 1
G xml, jdom "Entität wurde referenziert aber nicht deklariert." XML & JSON 4
A XSL und JDom XML & JSON 3
G jdom-Klassen in Eclipse importieren XML & JSON 2
S JDOM ohne XML Header erzeugen? XML & JSON 2
G JDOM - aus Children-Liste ein Child direkt ansprechen ohne XPath? XML & JSON 9
S JDOM nur Attribut Name XML & JSON 2
X JDom für SOAP Dateien geeignet? XML & JSON 3
T Xpath & JDOM Element Pfad ausgeben XML & JSON 2
M XML Parsen JDOM NullPointerEcxeption XML & JSON 7
S jdom hasChildren()? XML & JSON 1
T Frage zu getContent unter jdom XML & JSON 6
Z Tutorial für JDOM (XSD-Shema) XML & JSON 3
D jdom, xml, login-system XML & JSON 4
N JDOM: XML einlesen XML & JSON 4
O Parsen einer XML mit JDOM ohne Doctype Declaration XML & JSON 2
lordcarlos jdom zu iso-8859-15 zwingen XML & JSON 4
P jdom XML-Encoding auslesen XML & JSON 12
E JDOM - letzem child Attribut hinzufügen XML & JSON 4
H Schema-Validierung mit JDOM XML & JSON 2
lordcarlos JDOM und entfernen von children XML & JSON 4
E JDOM - Problem beim Zusammenfügen zweier Dateien XML & JSON 2
T jdom.jar als Relativer Pfad in Eclipse einbinden XML & JSON 4
sparrow JDom Element.getChild("Name") liefert null obwohl vorhanden XML & JSON 4
E XML - JDOM - Bäume: was würdet ihr hier machen? XML & JSON 11
A JDOM: Wert schreiben bzw. ändern XML & JSON 6
T JDOM Bibiliothek XML & JSON 3
K JDOM vs. DOM, Schnittstellen XML & JSON 5
P Große XML Datei mittels JDOM bearbeiten / einlesen XML & JSON 6
0x7F800000 jdom mit xml.transform inkompatibel, was soll ich nehmen? XML & JSON 2
T EXSD auslesen mit XPath und JDOM XML & JSON 8
A JDOM und Sonderzeichen < > XML & JSON 17
G Simples XML File einlesen mit JDom. Prefix not bound ? XML & JSON 2
N jdom problem beim lesen von child elementen XML & JSON 5
N problem bei xml lesen mit jdom XML & JSON 2
S Ampersand im Jdom-Element XML & JSON 2
N jdom - xslt-Verweis in .xml einfügen XML & JSON 3
S Jdom+java webstart XML & JSON 4
K html -> cyberneko -> xml -> jdom . XML & JSON 3
I JDom Text ändern XML & JSON 4
C jdom.Element nicht vorhanden? XML & JSON 4
W JDOM element ändern funzt nich :( [problem gelöst] XML & JSON 3
C XPath in JDOM klappt nicht XML & JSON 2
S Harte Nuss mit XML und JDOM XML & JSON 2
H mit JDOM Verarbeitungsanweisungen und Kommentare auslesen XML & JSON 2
B jdom: getChildren() problem XML & JSON 4
T Bild in XML per JDOM XML & JSON 4
D JDOM erzeugt leere xmlns Attribute XML & JSON 4
T Elemente zählen mit JDOM in XML XML & JSON 7
B jdom document aus string erzeugen? XML & JSON 1
M JDOM und XPath, zu Element zugehörigen XPath-Ausdruck XML & JSON 5
F JDOM und XPath - Problem mit Namespace ohne Prefix XML & JSON 5
T XML mit JDOM auslesen => langsam? XML & JSON 7
B jdom outputter ohne attribute XML & JSON 2
C XML encoding UTF-8 und JDOM XML & JSON 4
P Probleme mit JDom . addContent(int index,Collection c) XML & JSON 2
R key aus xml lesen mittels jdom XML & JSON 5
M JDOM Element ohne Inhalt kopieren ? XML & JSON 3
X JDOM SAXBuilder Validationschema - Problem XML & JSON 8
G einzelne tags mit jdom auslesen XML & JSON 4
F XML ( ca. 280 MB) JDom & SAXBuilder lesen = OutOfMemoryE XML & JSON 4
K JDOM SAXBuilder einlesen XML & JSON 6
S Ausgabe "asXML" mit Jdom XML & JSON 2
B Element an bestimmter Stelle einfügen (JDOM) XML & JSON 8
G XML mit JDOM ausgeben [Klappe die 1Mio.ste] XML & JSON 2
F XML mit JDOM auslesen XML & JSON 2
D JDOM auf den PC machen XML & JSON 6
J JDOM Unicode XML & JSON 2
J schema-Validierung mit xerces und jdom: bug in java 1.4? XML & JSON 9
P JDOM Werte verändern XML & JSON 4
S OutOfMemory mit JDOM XML & JSON 6
S org.jdom.document in String umwandeln. XML & JSON 2
M ISO-8859-1 >> UTF-8 + JDOM + Verwirrung. XML & JSON 2
J [Newbie] [JDOM] Element aus XML entfernen klappt nicht XML & JSON 4
J JDOM mit XML-Schema XML & JSON 8
P HTML-Sting in JDOM XML & JSON 7
B JDOM && ObjectOutputStream XML & JSON 8
B Versionskonflikt bei JDOM XML & JSON 9
B JDom -- getChild() liefert nicht nachvollziehbar null XML & JSON 2
M JDOM parse Exception XML & JSON 3
G JDom encoding ändern XML & JSON 2
R JDOM Root-Element entfernen aber Rest behalten XML & JSON 10
M XML Elemente mit JDOM durch Text ersetzen XML & JSON 2

Ähnliche Java Themen

Neue Themen


Oben