UTF-8 kodierte Java-Builds mit Maven

Um möglichst systemunabhängig zu sein, sollte man seinen Code im UTF-8 Zeichensatz speichern. Beachtet man das nicht, meldet Maven beim Buildvorgang möglicherweise folgende Warnung:

Using platform encoding (Cp1252 actually) to copy filtered resources, i.e. build is platform dependent!

Um den UTF-8 Zeichensatz in Maven zu erzwingen, muss die Eigenschaft project.build.sourceEncoding in der Konfigurationsdatei pom.xml gesetzt werden. Wer Analyse-Tools wie Cobertura einsetzt, der sollte außerdem noch die Eigenschaft project.reporting.outputEncoding auf UTF-8 setzen, damit die Logfiles ebenfalls mit UTF-8 kodiert werden.

Beispiel

1
2
3
4
5
6
7
8
9
10
<project xmlns="http://maven.apache.org/POM/4.0.0" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  ...
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  </properties>
  ...
</project>

Deutsche Umlaute in LaTeX benutzen

Wer deutsche Umlaute in seinen LaTeX-Dokumenten korrekt dargestellt haben möchte, sollte darauf achten, dass die TeX-Datei mit UTF-8 kodiert ist. Um mit LaTeX den UTF-8-Zeichensatz (und somit auch die deutschen Umlaute und weitere Sonderzeichen) zu benutzen, muss das Input Encoding mit folgender Deklaration auf UTF-8 gestellt werden:

\usepackage[utf8]{inputenc}

ASCII Herzen schreiben

Alle kennen es, alle lieben es. Das ASCII-Herz. Gemeint ist damit dieses Herzchen-Symbol: ♥. Das Witzige ist aber, dass das Herz gar nicht in den 128 Zeichen der ASCII-Zeichentabelle vorkommt, sondern Zeichen Nummer 9829 im Unicode ist. In frühen Jahren hat man das aber in Internetforen falsch aufgeschnappt und die Herzen mit ASCII-Arts in Verbindung gebracht, weshalb noch immer viele nach dem Begriff „ASCII Herz“ suchen.

Möchte man das Herz in einem HTML-Dokument mit UTF-8 Kodierung darstellen, so gibt es zwei Wege dafür. Einmal als Hex-Code: &#x2665 und einmal als Dezimal-Code: &#9829.

Unter Windows kann man das Herz übrigens durch gleichzeitiges Drücken der Alt-Taste zusammen mit der Zahl 3 (auf dem Num-Block) einfügen. Ein weiterer Weg führt über die Windows Zeichentabelle (Start -> Ausführen -> charmap.exe):

ASCII-Code in Unicode (UTF-8) mit Java umwandeln

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);

Invalid byte 2 of 3-byte UTF-8 sequence

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" ?>

Session must be started before any output has been sent to the browser

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.