Tschechische Zeichen in XML-Antwort

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hallo,

ich schicke einen Request an Google zur Abfrage des Geocodes.
Als Antwort bekomme ich einen XML-String.
Das klappt auch soweit ganz gut, bis auf die Umwandlung spezieller Zeichen (Zeichen aus tschechischer Sprache) nach UTF8.
Hier ist mein Code:
Code:
               DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
                        DocumentBuilder docBuild = factory.newDocumentBuilder();
			URL website = new URL(sURL);
			URLConnection connection = website.openConnection();
			connection.setRequestProperty("Accept-Language", "de-de,de;q=0.5");
			InputStream input = connection.getInputStream();
			InputStreamReader isrInput = new InputStreamReader(input);
			BufferedReader br = new BufferedReader(isrInput);
			String sResult = "";
                        String sBRTemp = "";
			while (null != (sBRTemp = br.readLine())) sResult += sBRTemp;
			ByteArrayInputStream docBAIS = new ByteArrayInputStream(sResult.getBytes("UTF-8"));
			Document xmlDoc = docBuild.parse(docBAIS);

Kann mir bitte jemand sagen, was mir noch fehlt, damit auch die tschechischen Zeichen richtig eingelesen werden.
 

Ebenius

Top Contributor
Warum so kompliziert? Funktioniert das nicht?
Code:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuild = factory.newDocumentBuilder();
URL website = new URL(sURL);
URLConnection connection = website.openConnection();
connection.setRequestProperty("Accept-Language", "de-de,de;q=0.5");
InputStream input = connection.getInputStream();
Document document = docBuild.parse(input);
input.close();

Ebenius
 
G

Guest

Gast
Wenn ich das so einfach mache, kommt folgender Fehler:

[Fatal Error] :-1:-1: Premature end of file.
Exception in thread "main" org.xml.sax.SAXParseException: Premature end of file.
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:264)
at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:292)
at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:98)
at Main.Check_Addresses(Main.java:183)
at Main.main(Main.java:35)
 
G

Guest

Gast
Ich glaube, dieser Fehler tritt auf, weil die XML-Antwort aus mehreren Zeilen besteht.
 

Ebenius

Top Contributor
Was passiert bei dem?
Code:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
DocumentBuilder docBuild = factory.newDocumentBuilder(); 
URL website = new URL(sURL); 
URLConnection connection = website.openConnection(); 
connection.setRequestProperty("Accept-Language", "de-de,de;q=0.5"); 
Reader input = new InputStreamReader(connection.getInputStream(), connection.getContentEncoding()); 
Document document = docBuild.parse(input); 
input.close();
 
G

Guest

Gast
In diesem Fall bekomme ich schon beim Kompilieren ein Problem, weil ich der Methode "DocumentBuilder.parse" keinen Reader als Parameter übergeben kann.
 

Ebenius

Top Contributor
Entschuldige, hab nicht aufgepasst. Ich meinte eigentlich:
Code:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
DocumentBuilder docBuild = factory.newDocumentBuilder(); 
URL website = new URL(sURL); 
URLConnection connection = website.openConnection(); 
connection.setRequestProperty("Accept-Language", "de-de,de;q=0.5"); 
Reader input = new InputStreamReader(connection.getInputStream(), connection.getContentEncoding()); 
Document document = docBuild.parse(new InputSource(input)); 
input.close();

Ebenius
 
G

Guest

Gast
Beim Ausführen wird folgende Exception ausgelöst:
Exception in thread "main" java.lang.NullPointerException: charsetName
at java.io.InputStreamReader.<init>(InputStreamReader.java:82)
at Main.Check_Addresses(Main.java:179)
at Main.main(Main.java:36)

Der Aufruf von "connection.getContentEncoding()" gibt "null" zurück.
Das ist bestimmt die Ursache für obige Exception.
 

Ebenius

Top Contributor
Tut da ein eingeschobenes ...
Code:
connection.connect();
... nach Zeile 5 etwas gutes?
 
G

Guest

Gast
Tut mir leid, aber die Methode "connection.getContentEncoding()" gibt immer noch "null" zurück.

Ich muss mich jetzt leider verabschieden, bin aber morgen früh ab 8 Uhr wieder im Forum. Ich würde mich freuen, wenn wir morgen an dieser Stelle weiter machen könnten, da ich mich schon seit Tagen mit diesem Problen rumschlage.
 
G

Guest

Gast
Ich bin wieder im Forum und würde mich über jede Meldung bezüglich meines Problems freuen.
 

Ebenius

Top Contributor
Ich schau's mir grad an. Der Content-Type ist in der Antwort gesetzt, aber irgendwas machen wir wohl noch falsch:
Code:
HTTP/1.1 200 OK
Content-Type: text/xml; charset=ISO-8859-1
Set-Cookie: PREF=ID=1dd3219bf9709b41:TM=1234517657:LM=1234517657:S=Ja47Gngzmxp3vIO1; expires=Sun, 13-Feb-2011 09:34:17 GMT; path=/; domain=.google.com
Date: Fri, 13 Feb 2009 09:34:17 GMT
Server: mfe
Cache-Control: private, x-gzip-ok=""
Transfer-Encoding: chunked
Expires: Fri, 13 Feb 2009 09:34:17 GMT
Bis gleich!

Ebenius
 

Ebenius

Top Contributor
So funktioniert's, oder?
Code:
public static void main(String[] args) throws Exception {
  final String urlStr = "http://" //
        + "maps.google.com"
        + "/maps/geo" //
        + "?q=Shaanxi+Chang'an&gl=CN&output=xml";
  final URL url = new URL(urlStr);
  final URLConnection connection = url.openConnection();
  DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
  DocumentBuilder docBuild = factory.newDocumentBuilder();
  connection.setRequestProperty("Accept-Language", "de-de,de;q=0.5");

  final Charset cs = determineCharset(connection);

  InputStream input = new BufferedInputStream(connection.getInputStream());
  final BufferedReader reader =
        new BufferedReader(new InputStreamReader(input, cs));
  Document document = docBuild.parse(new InputSource(reader));
  input.close();
}

/** Determines the charset to use from the given URL connection. */
private static Charset determineCharset(URLConnection connection) {
  final String contentType = connection.getContentType();
  Charset cs = Charset.defaultCharset();
  if (contentType != null) {
    final Pattern p = Pattern.compile(".*;\\s*charset=(.+)");//$NON-NLS-1$
    final Matcher m = p.matcher(contentType);
    if (m.matches()) {
      final String charsetName = m.group(1);
      try {
        cs = Charset.forName(charsetName);
      } catch (IllegalCharsetNameException ex) {
        // TODO: Logging; Using default charset due to illegal charset name
      } catch (UnsupportedCharsetException ex) {
        // TODO: Logging; Using default charset due to unsupported charset
      } catch (IllegalArgumentException ex) {
        assert false : "The charset cannot be null, here"; //$NON-NLS-1$
      }
    }
  }
  return cs;
}

Happy Hacking!
Ebenius
 
G

Guest

Gast
Vielen Dank,

das muss ich mir erst mal in Ruhe ausprobieren und anschauen.
 
G

Guest

Gast
Hallo Ebenius,

ich habe Deinen Code ausprobiert und die Codierung der Verbindung wird korrekt ausgelesen. Aber die Sonderzeichen werden immer noch nicht korrekt ausgelesen.
Muss der Inhalt des Documents irgendwie in UTF8 umgewandelt werden ?
 

Ebenius

Top Contributor
Anonymous hat gesagt.:
Hallo Ebenius,

ich habe Deinen Code ausprobiert und die Codierung der Verbindung wird korrekt ausgelesen. Aber die Sonderzeichen werden immer noch nicht korrekt ausgelesen.
Muss der Inhalt des Documents irgendwie in UTF8 umgewandelt werden ?
Das sollte eigentlich der XML-Parser anhand der Processing Node selber machen... Kannst Du mal diesen Code ausführen und das ausgegebene XML hier posten? Vielleicht ist ja der Inhalt schlicht falsch?
Code:
public static void main(String[] args) throws Exception { 
  final String urlStr = YOUR_URL;
  final URL url = new URL(urlStr); 
  final URLConnection connection = url.openConnection(); 
  DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
  DocumentBuilder docBuild = factory.newDocumentBuilder(); 
  connection.setRequestProperty("Accept-Language", "de-de,de;q=0.5"); 

  final Charset cs = determineCharset(connection); 

  InputStream input = new BufferedInputStream(connection.getInputStream()); 
  final BufferedReader reader = 
        new BufferedReader(new InputStreamReader(input, cs)); 
  String line;
  while ((line = reader.readLine()) != null) {
    System.out.println(line);
  }
  input.close(); 
}
Danke, Ebenius
 
G

Guest

Gast
Hier die Antwort:
<?xml version="1.0" encoding="UTF-8" ?>
<kml xmlns="http://earth.google.com/kml/2.0"><Response>
<name>Shaanxi Chang&an</name>
<Status>
<code>200</code>
<request>geocode</request>
</Status>
<Placemark id="p1">
<address>XiAn, Shaanxi, China</address>
<AddressDetails Accuracy="4" xmlns="urn:eek:asis:names:tc:ciq:xsdschema:xAL:2.0"><Country><CountryNameCode>CN</CountryNameCode><CountryName>China</CountryName><AdministrativeArea><AdministrativeAreaName>Shaanxi</AdministrativeAreaName><Locality><LocalityName>XiAn</LocalityName></Locality></AdministrativeArea></Country></AddressDetails>
<ExtendedData>
<LatLonBox north="34.3720707" south="34.1760922" east="109.1041517" west="108.7775767" />
</ExtendedData>
<Point><coordinates>108.9442599,34.2648777,0</coordinates></Point>
</Placemark>
</Response></kml>

Die Abfrage über Firefox gibt mir aber folgende <address>-Zeile:
<address>Xi’An, Shaanxi, China</address>

In die CSV-Datei wird für das Zeichen "´" ein unleserliches Zeichen abgespeichert.
 

Ebenius

Top Contributor
Sorry, aber da macht google was falsch. Das erste Beispiel von mir oben ist richtig (direkt vom Strom lesen). Das Zeichen worüber man stolpert ist ein 0x92, welches weder in UTF-8 (wie in der XML encoding declaration angegeben) noch in Latin-1 (wie im HTTP-Kopf angegeben) existiert. Richtig wäre, die XML encoding declaration (UTF-8) zu beachten und nur falls diese nicht angegeben ist auf die Kodierung aus dem HTTP-Kopf zurück zu fallen.

In Latin-1 ist 0x92 ein nicht definiertes Zeichen.

In UTF-8 ergibt sich eine ungültige Sequenz. Binär ausgedrückt ist 0x92 = 10010010. Gültig ist in UTF-8:
(x steht nachfolgend für wahlweise 0 oder 1)
  • 0xxxxxxx für ASCII 7bit, ein Bytes pro Zeichen
  • 110xxxxx gefolgt von 10xxxxxx für 2 Bytes pro Zeichen
  • 1110xxxx gefolgt von 10xxxxxx 10xxxxxx für 3 Bytes pro Zeichen
  • 11110xxx gefolgt von 10xxxxxx 10xxxxxx 10xxxxxx für 4 Bytes pro Zeichen
Bytes wie das obige 0x92 mit einer Maske 10xxxxxx sind sogenannte Folge-Bytes die durch ein Start-Byte (11xxxxxx) eingeleitet werden müssen. Das Byte vor dem Problem-Byte ist aber kein Start-Byte, sondern 0x69 (01101001) was einem normalen mit einem Byte kodierten Zeichen 'i' entspricht.

Also wird Dir nichts übrig bleiben, als Dich an google zu wenden und den Fehler zu beschreiben!

Ebenius
 
G

Guest

Gast
Warum kann aber der Firefox-Browser die Antwort mit allen Zeichen darstellen ?
 

Ebenius

Top Contributor
Anonymous hat gesagt.:
Warum kann aber der Firefox-Browser die Antwort mit allen Zeichen darstellen ?
Bist Du denn sicher, dass das Zeichen im FireFox das richtige Zeichen ist? Oder soll da vielleicht doch was anderes stehen? Vielleicht rät der Firefox ja das Charset Encoding anhand irgendwelcher schlauer Regeln...?

Oder ich habe irgendwas nicht bedacht; glaub ich aber nach so viel probieren und nachlesen eigentlich nicht.

Ebenius
 
G

Guest

Gast
Die Zeichen im Firefox machen schon Sinn.

Ich danke Dir aber recht herzlich für Deine Bemühungen und Deine Geduld und verabschiede mich jetzt ins Wochenende.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
MarvinsDepression Unbekanntes Zeichen in fremden Code wirft Fragen auf Allgemeine Java-Themen 4
S Zeichen | in regex Allgemeine Java-Themen 8
_user_q JavaFX Robot alle Unicode-Zeichen schreiben lassen können Allgemeine Java-Themen 12
T Komische Zeichen im Zusammenhang mit Serializable interface Allgemeine Java-Themen 13
M Checkstyle 100 Zeichen pro Zeile Allgemeine Java-Themen 11
T Letztes Zeichen eines Strings enfernen Allgemeine Java-Themen 14
Master3000 Komisches Zeichen als Ausgabe in der Konsole Allgemeine Java-Themen 20
M Warum gibt es Unterschiedliche Kommentar Zeichen Allgemeine Java-Themen 15
N Überprüfung ob ein bestimmtes Zeichen <1 mal vorkommt Allgemeine Java-Themen 2
N Prüfen, ob ein String 2x das selbe Zeichen hat Allgemeine Java-Themen 10
G Übermittlung zusätzlicher ASCII-Zeichen bei Übertragung von Dateiinhalt mit Xmodem - JAVA Allgemeine Java-Themen 9
R Wie bekomme ich das Zeichen 'digit' an vorderster Stelle Allgemeine Java-Themen 4
S [Regex] Nur diese Zeichen beachten Allgemeine Java-Themen 1
Bluedaishi Zeile um zeichen erweitern Allgemeine Java-Themen 9
N Datei Zeilenweise Einlesen, Versteckte Zeichen Allgemeine Java-Themen 5
Xge Replace x Zeichen aus String Allgemeine Java-Themen 2
S Java Editor Bekomme bei der Code-Vervollständigung die Zeichen &#8203; Allgemeine Java-Themen 3
E Compiler-Fehler Unicode Zeichen einlesen Allgemeine Java-Themen 1
U Variablen Stringarrays mit wenig verschiedenen Zeichen effizienter speichern Allgemeine Java-Themen 10
T xls-Datei per Apache Commons CsvParser einlesen UTF-8 Zeichen russische Zeichen Allgemeine Java-Themen 2
AssELAss String jeweils nach x Zeichen Zeilenumbruch Allgemeine Java-Themen 1
DStrohma Input/Output KeyEvent nur verarbeiten wenn es ein "sichtbares" Zeichen ist? Allgemeine Java-Themen 1
B In Java String ein + Zeichen Allgemeine Java-Themen 4
AssELAss Zeilenumbruch immer nach bestimmtem Zeichen Allgemeine Java-Themen 1
J Anzahl der Zeichen bei Eingabe begrenzen Allgemeine Java-Themen 5
V Tastendruck für UTF-8 Zeichen emulieren Allgemeine Java-Themen 4
B BufferedWriter in InputStream oder Zeichen-Stream in Byte-Stream Allgemeine Java-Themen 5
C Hex Zeichen ersetzen durch leer Zeichen Allgemeine Java-Themen 5
R Besondere Zeichen in Dateinamen Allgemeine Java-Themen 4
B Alt-Griechisch Zeichen in Dateien Allgemeine Java-Themen 2
G AES Verschlüsselung nur bis 63 Zeichen Länge Allgemeine Java-Themen 2
M Fehlende Zeichen beim Drucken mit PDFBox Allgemeine Java-Themen 10
J String nur erste Zeichen vergleichen Allgemeine Java-Themen 6
C Variablen $-Zeichen in String ersetzen Allgemeine Java-Themen 3
S String Zeichen für Zeichen vergleichen Allgemeine Java-Themen 4
L Problem bei ausführbarer jar Datei mit Unicode-Zeichen Allgemeine Java-Themen 4
S String in Double - letztes Zeichen fehlt Allgemeine Java-Themen 4
A Erstes Zeichen im String "toUpperCase"n Allgemeine Java-Themen 11
A Umwandlung von Text/Zeichen in Polynome Allgemeine Java-Themen 8
cedi int Zahl in ein ASCII zeichen umwandeln und dieses in ein externes Textfenster schreiben Allgemeine Java-Themen 6
K String: alle X Zeichen Zeilenumbruch Allgemeine Java-Themen 3
M Nach Programmdurchlauf werden Zeichen falsch dargestellt + Anderes Verhalten unter Windows Allgemeine Java-Themen 6
Zettelkasten Aus String bestimmtes Zeichen herausfinden Allgemeine Java-Themen 19
M Asterisk in String ("Egal-Zeichen") Allgemeine Java-Themen 4
V Chinesische Zeichen Escapen Allgemeine Java-Themen 4
I Teilweise falsche Darstellung jap. Zeichen im JEditorPane mit RTFEditorKit aus RTF-Datei Allgemeine Java-Themen 5
D Datei mit allen Ascii Zeichen Allgemeine Java-Themen 2
R Unsichtbare Zeichen Allgemeine Java-Themen 7
U Namen von Klassen haben $-Zeichen Allgemeine Java-Themen 5
P RegEx und $-Zeichen als Literal Allgemeine Java-Themen 5
neonfly Anzahl Zeichen pro Zeile auf der Konsole Allgemeine Java-Themen 8
C Strings zwischen 2 Zeichen auslesen Allgemeine Java-Themen 7
A Zeichen beim Eingeben in ein DOS-Fenster nicht anzeigen? Allgemeine Java-Themen 3
F Hexcode von ASCII Zeichen erhalten Allgemeine Java-Themen 2
J Mit Scanner-Klasse eine Datei zeilenweise einlesen und nur bestimmte Zeichen abfragen Allgemeine Java-Themen 11
V Dateien mit &-Zeichen im Namen öffnen Allgemeine Java-Themen 13
N String in einzelne Zeichen zerlegen Allgemeine Java-Themen 8
M Problem mit Zeichen aus einer Datei auslesen Allgemeine Java-Themen 2
T Shapes vergleichen? Zeichen erkennen? Allgemeine Java-Themen 7
G String.replaceall - mehrere Zeichen durch eines ersetzen Allgemeine Java-Themen 5
J Encoding und Gewinnung von Zeichen aus der Hexa-Darstellung Allgemeine Java-Themen 6
N Xor Warum kommt Flasches Zeichen in Java Allgemeine Java-Themen 36
S Stringarray splitten an unbekanntem Zeichen Allgemeine Java-Themen 7
A Dezimalzahlen: Komma-Zeichen Allgemeine Java-Themen 4
T Einzelnes Zeichen von der Tastatur einlesen, aber ohne Enter Allgemeine Java-Themen 4
S Was bedeutet dieser Zeichen Allgemeine Java-Themen 4
E Wie Zeichen eingeben mit Klasse Scanner? Allgemeine Java-Themen 5
S Zeichen, dass Programm noch läuft Allgemeine Java-Themen 3
M Anwendung nur einmal starten / Zeichen in String zählen Allgemeine Java-Themen 7
T [Regex] Zeichen ausschließen Allgemeine Java-Themen 8
Luma Unicode Steuerzeichen von druckbaren Zeichen trennen Allgemeine Java-Themen 10
M JTable: Anzahl Zeichen bei Eingabe Allgemeine Java-Themen 2
G String parsen und Problem mit escaped zeichen Allgemeine Java-Themen 4
Z Letztes zeichen eines strings löschen Allgemeine Java-Themen 3
A bestimmte Zeichen aus einem String auslesen Allgemeine Java-Themen 2
L unicode-zeichen in ein txt-File schreiben Allgemeine Java-Themen 3
J Problem mit nichtlateinischen Zeichen Allgemeine Java-Themen 2
B String + Zeilenumbruch nach X-Zeichen Allgemeine Java-Themen 4
M Nach 4 Zeichen Fokus ändern Allgemeine Java-Themen 2
oliver1974 Wie ResourceBundles mit Unicode Zeichen korrekt einlesen? Allgemeine Java-Themen 4
E Alarm ausgeben (ASCII Zeichen 7) über Lautsprecher Allgemeine Java-Themen 11
G Alle Zeichen des Alphabets ausgeben Allgemeine Java-Themen 4
K String-Objekt mit zig tausend Zeichen Allgemeine Java-Themen 12
T Muster/Zeichen/Texterkennung auf einem Image Allgemeine Java-Themen 9
Y Zeichen verschiedenfarbig in einer JTextPane darstellen Allgemeine Java-Themen 17
P Regulärer Ausdruck um sich wiederholende Zeichen zu finden. Allgemeine Java-Themen 9
O Split methode tut bei Zeichen "\", "\\" Allgemeine Java-Themen 7
H Unicode Darstellung in Java, spezielles Zeichen gesucht Allgemeine Java-Themen 4
S Unicode-Zeichen erstellen/ Kodierung Allgemeine Java-Themen 4
J RegEx: "wenn zeichen folgen ersetze x mit y, sonst mit Allgemeine Java-Themen 2
Z Zeichen/char in einer Datei löschen Allgemeine Java-Themen 6
I $ zeichen im class-namen Allgemeine Java-Themen 4
S ￾ Zeichen umwandeln in ü per .replace(); Allgemeine Java-Themen 6
N Zeilenumbruch in String nach jeweils x Zeichen einfügen? Allgemeine Java-Themen 6
D gewisse Zeichen sind nach dem entschlüsseln anders Allgemeine Java-Themen 2
G Wandeln von Char Wert in Zeichen? Allgemeine Java-Themen 2
G subString() aber nicht auf Länge sondern auf Zeichen Allgemeine Java-Themen 3
L Hex --> Dezimal --> Zeichen Allgemeine Java-Themen 7
M Codepage Problem (Vertauscht Zeichen beim Lesen aus Datei) Allgemeine Java-Themen 3
C Unicode für Promille-Zeichen Allgemeine Java-Themen 5

Ähnliche Java Themen

Neue Themen


Oben