EF BF BD EF BF BD EF BF BD

Vor einigen Tagen begegneten mir einige Dateien, deren Inhalts größtenteils aus der Zeichenfolge EF BF BD EF BF BD EF BF BD (hexadizimal) bestand. Eigentlich sollte in den entsprechenden Dateien binäre Daten enthalten sein. Damit stellte sich nun die Frage: Was war passiert?

EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD EF BF BD

Auf den ersten Blick sah das ganze so aus, als ob ein Großteil der Datei durch Datenmüll ersetzt wurde. Schaut man sich die Zeichenfolge allerdings genauer an, so wird man feststellen das sich die Folge EF BF BD immer und immer wieder wiederholt. Bei dieser Zeichenfolge handelt es sich um die hexadezimale Schreibweise des Unicode-Zeichens für den Replacement Character welcher meist durch eine Raute mit einem Fragezeichen (�) dargestellt wird.

Eindeutiger wäre das Problem gewesen, wenn die erzeugten Dateien mit der Zeichenfolge EF BB BF begonnen hätte. Dabei handelt es sich um das Byte Order Mark für eine UTF-8 kodierte Datei. Damit wäre gleich klar geworden, das die enthaltenen Daten nicht zu einer Datei mit binären Inhalten passen. Doch wie sind diese Dateien nun entstanden? Der Ursprung der Dateien ist in einer Java-Applikation zu finden, welche diese Dateien erstellt. Diese kopierte die Daten von A nach B, im Quelltext (man ignoriere das fehlende try with resources) könnte das so ausgesehen haben:

FileInputStream fileInputStream  = new FileInputStream("binary.dat");
FileWriter fileWriter = new FileWriter("binary-copied.dat");

int byteData;

while ((byteData = fileInputStream.read()) != -1) {
    fileWriter.write(byteData);
}

fileInputStream.close();
fileWriter.close();

Hier wird ein FileInputStream geöffnet und dieser Stück für Stück mit einem FileWriter in die Zieldatei geschrieben. Genau an dieser Stelle entsteht das Problem – der FileWriter ist nämlich ein zeichenbasierter Writer, das bedeutet das sämtliche Zeichen, die mit diesem geschrieben werden, kodiert werden. Wenn nun bei dieser Kodierung ein Zeichen gefunden wird, welches nicht im Unicode abgebildet werden kann, so erhält dieses Zeichen den Wert EF BF BD – besagter Replacement Character. Damit ist dann auch erklärt warum die binären Dateien hauptsächlich nur noch aus diesen Zeichen bestanden. Die echten Daten wurden beim Kopiervorgang größtenteils schlicht und ergreifend in den Replacement Character konvertiert, da sich für diese Daten keine Entsprechung im Unicode fand.

Seltsame Zeichen unter PuTTY

Wenn man PuTTY nutzt, wird man sich sicherlich das ein oder andere Mal über die seltsame Zeichen gewundert haben. Ein schönes Beispiel dafür ist der Midnight Commander, der anstatt mit der gewohnten Linienoptik mit ganz anderen Zeichnen arbeitet. Das Problem ist hier allerdings nicht beim Server zu finden. Stattdessen muss bei PuTTY gesucht werden.

Die PuTTY Optionen

Die PuTTY Optionen

Um das Problem zu beheben, sollte man in den Einstellungen unter “Window” -> “Translation” das “Remote character set” auf UTF-8 stellen. Danach gehören die fehlerhaften Zeichen der Vergangenheit an.

Eclipse auf Unicode einstellen

Unter Umständen hat Eclipse nach der Installation eine systemspezifische Kodierung eingestellt. Für Windows ist dies z.B. Cp1252. Um Eclipse nun standardmäßig auf UTF-8 umzustellen geht man über Window -> Preferences in den Einstellungsdialog und dort in der linken Box auf General -> Workspace. Dort kann dann unter Text file encoding die Kodierung auf UTF-8 gestellt werden.

Kleines MySQL / UTF-8 Problem

Es war einmal eine Datenbank deren Tabellen waren im UTF-8 Format. Auch die PHP Anwendung benutze UTF-8. Also wird einfach mittels:

mysql_connect($db_host, $db_name, $db_password);
mysql_select_db($db_name);

$sql = "SELECT * FROM Cubes WHERE ID = '" . $id . "' ORDER BY " . $NameLang;
$result = mysql_query($sql);

eine Verbindung aufgebaut und die Datenbank abgefragt. Nun könnte man annehmen das das ganze als UTF-8 zurück kommt aber wie so oft im Leben war dem nicht so. Die Umlaute etc. wurden falsch kodiert ausgeliefert. Die Lösung des Problemes ist glücklicherweise simpel und einfach (sobald man die Lösung kennt :) ) Es muss nach der Verbindung zur Datenbank die Verbindung auf UTF-8 umgestellt werden. Dies geschieht mittels mysql_query(“SET NAMES ‘UTF8′”);. Nun sieht das ganze so aus:

mysql_connect($db_host, $db_name, $db_password);
mysql_query("SET NAMES 'UTF8'");
mysql_select_db($db_name);

$sql = "SELECT * FROM Cubes WHERE ID = '" . $id . "' ORDER BY " . $NameLang;
$result = mysql_query($sql);

Und wieder ein Problem gelöst :)