Benny's Blog
Navigation: Home » Archives for UTF-8
11. Januar 2011

Gegeben ist folgende ASCII-Codierung:

%7b%22email%22%3a%22bn%40bennyn.de%22%2c%22name%22%3a%22Benny%20Neugebauer%22%7d

Wie wir wissen, stellt der ASCII-Code genau 1 Byte (8 Bit) dar. Dazu wird eine Sequenz in der Form %xy angegeben, wobei “xy” eine zweistellige Hexadezimal-Zahl ist, welche die 8-Bit repräsentiert. Ein Blick in die ASCII-Tabelle zeigt uns folgende Kodierung:

%20 = blank (Leerzeichen)
%22 = "
%3a = :
%40 = @
%2c = ,
%7b = {
%7d = }

Demnach müsste für unser Beispiel der entsprechende Unicode (UTF-8) so aussehen:

{"email":"bn@bennyn.de","name":"Benny Neugebauer"}

In Java lässt sich ASCII-Code in Unicode ganz leicht umwandeln:

1
2
3
String ascii = "%7b%22email%22%3a%22bn%40bennyn.de%22%2c%22name%22%3a%22Benny%20Neugebauer%22%7d";
String unicode = URLDecoder.decode(ascii, "UTF-8");
System.out.println(unicode);
1. Oktober 2010

Beim Parsen einer UTF-8 XML-Datei mit JDOM bekam ich eine MalformedByteSequenceException: Invalid byte 2 of 3-byte UTF-8 sequence. Obwohl die Codierung richtig war, musste ich im Header der Datei die folgende Zeile ersetzen:

<?xml version = "1.0" encoding = "UTF-8" ?>

Undzwar gegen diese:

<?xml version = "1.0" encoding = "ISO-8859-1" ?>
20. August 2010

Wenn das Zend Framework folgende Meldung liefert: “Warning: Exception caught by form: Session must be started before any output has been sent to the browser“, dann kann das daran liegen, dass die Zeichensatzkodierung für den Controller, der diesen Fehler verursacht, nicht korrekt gesetzt ist.

Bei mir wurde dieser Fehler durch einen Controller ausgelöst, der mit “UTF-8″ kodiert war. Eine Änderung der Kodierung auf “UTF-8 ohne BOM” sorgte hier für wahre Wunder. Die Kodierung mit “ANSI” hat auch funktioniert.

20. April 2010

Mit der Funktion header kann man in PHP den HTTP-Header eines Dokuments ändern. Das ist besonders sinnvoll, wenn man dem Browser Bilder ausliefern möchte und daher vermeiden will, dass der Browser das Bild als HTML-Seite interpretiert.

Beim Umgang mit header muss man darauf achten, dass vor dem Einsatz dieser Funktion keine HTML-Tags oder andere formatierte Ausgaben stattfinden. Außerdem dürfen sich vor (und nach!) der PHP-Einbindung keine Leerzeichen befinden.

Ein einfaches header-Beispiel ist:

<?php header("Content-type: image/jpeg") ?>

Selbst bei diesem Einzeiler kann es aber vorkommen, dass eine Warnung mit dem Text “Cannot modify header information – headers already sent by” ausgegeben wird. In diesem Fall ist die PHP-Datei in UTF-8-Codierung abgepeichert und enthält ein “Byte Order Mark” (kurz: BOM). Das BOM-Steuerzeichen wird von PHP falsch erkannt, weshalb man für diese Datei “UTF-8 ohne BOM” als Kodierung wählen muss.

Wie das geht, zeigt dieser Screenshot von Notepad++:

Tags: PHP, , , , ,
17. April 2010

Vorhin wollte ich in NetBeans ein älteres Eclipse-Projekt von mir importieren. Bei der Ausführung des Programms habe ich folgenden Fehler bekommen: Exception in thread “AWT-EventQueue-0″ java.lang.RuntimeException: Uncompilable source code. Obwohl der Source-Code keine syntaktischen Fehler hatte und mir alles “grün” in NetBeans angezeigt wurde, liess sich das Projekt nicht starten. Nach etwa ausprobieren habe ich festgestellt, dass der Fehler im Zeichensatz der Source-Code Dateien liegt. Die *.java-Dateien wurden in ANSI-Codierung abgespeichert. In den Kommentaren des Quellcodes habe ich aber Deutsche Umlaute verwendet, weshalb sich der Code nicht fehlerfrei ausführen lies.

Alles was ich tun musste war also, die Zeichensatz-Kodierung von ANSI auf UTF-8 umzustellen. Dadurch werden aber die Umlaute “zerstört” und durch “kleine Vierecke” ersetzt. Die Moral aus der Geschicht’: Verwende Umlaute lieber nicht! (…oder nur mir Escape-Sequenzen).

15. März 2010

Um UTF-8 Zeichensätze korrekt einlesen zu können, muss man (bei Verwendung der kXML-Bibliothek) den Parser auf UTF-8 einstellen:

1
2
3
4
FileConnection fc = (FileConnection) Connector.open(file:///root1/test.xml);
InputStream is = fc.openDataInputStream();
InputStreamReader reader = new InputStreamReader(is, "UTF-8");
XmlParser parser = new XmlParser(reader);

Zur Sicherheit sollten die XML-Dateien immer mit der Kodierung “UTF-8 ohne BOM” (einstellbar in Notepad++) abgespeichert werden.