Zeichensatz latin1 oder Unicode UTF-8

Zeichensatz latin1 oder Unicode UTF-8

Dieser Artikel geht auf die Frage ein, welchen Zeichensatz Sie für die Entwicklung Ihrer Webanwendungen verwenden sollen. Diese Frage ist relativ elementar, und sie sollte beantwortet werden, bevor Sie mit der Entwicklung eines größeren Projekts beginnen. (Eine nachträgliche Änderung des Zeichensatzes ist mühsam.)

Um das Thema hier nicht ausarten zu lassen, beschränkt sich der Abschnitt auf die beiden in unserem Sprachraum wichtigsten Zeichensätze, nämlich auf latin1 alias ISO-8859-1 und auf Unicode UTF-8 alias ISO-10646.

Vor den vielen Details als eine Art Kurzfassung des Abschnitts zwei Tipps:

  • Wenn für Ihre Anwendung der latin1-Zeichensatz ausreicht (und das wird für den Großteil der im deutschen Sprachraum entwickelten Anwendungen der Fall sein), verwenden Sie diesen Zeichensatz. Er verursacht bei weitem die geringsten Probleme.
  • Wenn Sie Unicode einsetzen (müssen), gehen Sie dabei möglichst konsequent vor. Nutzen Sie alle zur Verfügung stehenden Unicode-Möglichkeiten sämtlicher Glieder der Entwicklungskette, also Betriebssystem, Webserver, PHP, Datenbank, Editor bzw. Entwicklungswerkzeuge etc.

Theoretisch ist es auch möglich, in unterschiedlichen Ebenen der Entwicklung bzw. Datenverwaltung unterschiedliche Zeichensätze einzusetzen. Die Wahrscheinlichkeit, dass dann an irgendeinem Punkt beim Übergang von latin1 zu Unicode (oder umgekehrt) Probleme auftreten, beträgt aber nahezu 100 Prozent.

barcode 128

Zeichensatzgrundlagen

Zeichensätze bestimmen, welche Codes zur Darstellung von Zeichen verwendet werden. Bei den 128 US-ASCII-Zeichen sind sich die meisten Zeichensätze einig (z.B. Code 65 für den Buchstaben A). Problematischer ist die Darstellung internationaler Zeichen.

latin-Zeichensätze:

In der Vergangenheit wurden je nach Sprachraum verschiedene 1-Byte-Zeichensätze entwickelt, von denen die latin-Zeichensätze die größte Verbreitung gefunden haben: latin1 alias ISO-8859-1 enthält alle in Westeuropa üblichen Zeichen (äöüßáàå etc.)., latin2 alias ISO-8859-2 Zeichen aus Zentral- und Osteuropa etc. latin0 alias latin9 alias ISO-8859-15 entspricht latin1, enthält aber zusätzlich das Euro-Zeichen.

Die latin-Zeichensätze werden sowohl von Unix/Linux als auch von aktuellen Windows-Versionen unterstützt. Bei älteren Windows-Versionen kann ersatzweise die codepage 1252 verwendet werden (kurz CP 1252, manchmal auch ANSI-Zeichensatz genannt), die bis auf wenige Abweichungen dem latin1-Zeichensatz entspricht.

Das Problem bei diesen Zeichensätzen ist offensichtlich: Ihre Anwendung kommt nie mit allen Zeichen aus ganz Europa zurecht, weil jeder latin-Zeichensatz nur eine Teilmenge der Zeichen enthält.

Unicode-Varianten

Als Lösung wurde der 2-Byte-Zeichensatz Unicode entwickelt. Mit 65.535 möglichen Zeichen deckt er nicht nur alle Zeichen ganz Europas ab, sondern darüber hinaus auch noch die der meisten asiatischen Sprachen.

Unicode regelt allerdings nur, welcher Code welchem Zeichen zugeordnet ist, nicht, wie die Codes tatsächlich gespeichert werden. Hierfür bestehen wieder mehrere Varianten, von denen UCS-2 und UTF-8 die beiden wichtigsten sind. (UTF steht für Unicode Transfer Format, UCS für Universal Character Set.)

  • UCS-2 alias UTF-16: Die einfachste Lösung scheint auf den ersten Blick darin zu bestehen, jedes Zeichen einfach durch 2 Byte (also 16 Bit) darzustellen. Diese Formatierung wird UTF-16 oder UCS-2 genannt. Fast alle Betriebssystemfunktionen von Microsoft Windows verwenden diese Darstellung.
    Sie hat allerdings zwei Nachteile: Erstens verdoppelt sich der Speicherbedarf, und zwar auch in solchen Fällen, wo überwiegend europäische Zeichen oder gar nur US-ASCII-Zeichen gespeichert werden sollen. Zweitens tritt der Bytecode 0 an beliebigen Stellen in Unicode-Zeichenketten auf. Bei Texten mit US-ASCII-Zeichen ist sogar jedes 2. Byte 0. Viele C-Programme, E-Mail-Server etc. setzen aber voraus, dass das Byte 0 das Ende einer Zeichenkette markiert.
  • UTF-8: Die bei weitem populärste Alternative zu UTF-16 ist UTF-8. Dabei werden die US-ASCII-Zeichen (7 Bit) wie bisher durch ein Byte dargestellt, deren oberstes Bit 0 ist. Alle anderen Unicode-Zeichen werden durch zwei bis vier Byte lange Byte-Ketten dargestellt.
    Der offensichtliche Nachteil dieses Formats besteht darin, dass es keinen unmittelbaren Zusammenhang zwischen der Byteanzahl und der Anzahl der Zeichen eines Dokuments gibt. Wegen der größeren Kompatibilität zu existierenden Programmen und einer Reihe anderer Vorteile hat sich UTF-8 unter Unix/Linux und bei den meisten für die Webentwicklung wichtigen Komponenten als Standard etabliert. Wenn von Unicode die Rede ist, ist in Zukunft immer Unicode im UTF-8-Format gemeint.

Trotz der offensichtlichen Vorteile von Unicode - egal, in welcher Darstellung - gibt es zwei Gründe, die gegen den sofortigen Umstieg sprechen: Zum einen ist der Unicode-Zeichensatz inkompatibel mit den bekannten 1-Byte-Zeichensätzen; vorhandene Datenbestände und Codedateien müssen also konvertiert werden. Zum anderen ist die Unicode-Unterstützung der Komponenten, die bei der Webentwicklung zum Einsatz kommen, noch alles andere als perfekt.

network 128

Zeichensatzunterstützung in Apache, PHP und MySQL

Dieser Abschnitt behandelt im Folgenden die gesamte Kette der Werkzeuge und Programme, vom Apache-Server bis zum Webbrowser auf dem Client. Der Abschnitt geht auch auf das Format HTML und das Protokoll HTTP sowie auf die Zeichensatzkonfiguration unter Windows und Linux ein.

HTML

Laut HTML-Standard gilt für alle Dokumente ohne explizite Zeichensatzangabe der Zeichensatz iso-8859-1 (also latin1). Den verwendeten Zeichensatz können Sie am Beginn von HTML-Dokumenten angeben. Im HTML-Code sieht das so aus:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
...

Zulässige charset-Einstellungen sind utf-8, iso-8859-1, iso-8859-15 etc. Das Problem besteht allerdings darin, dass viele Webbrowser diese Information schlicht ignorieren und sich stattdessen auf die HTTP-Header-Daten verlassen (siehe unten).

HTML-Codes für Sonderzeichen

Wenn Sie möchten, dass internationale Sonderzeichen auch dann richtig dargestellt werden, wenn der Webbrowser die Zeichensatzinformation nicht oder falsch auswertet, können Sie für viele Sonderzeichen spezielle HTML-Codes einsetzen, beispielsweise &auml; statt a. Das macht Texte in HTML-Dokumenten allerdings schwer zu lesen. Bei Ausgaben, die Sie mit PHP durchführen, setzen Sie einfach die Funktion htmlentities ein. (htmlentities('aäb') liefert die Zeichenkette a&auml;b).

Info

Wenn Sie als Zeichensatz latin1 bzw. iso-8859-1 nutzen, können Sie zwar Sonderzeichen wie äöüß direkt im HTML-Code verwenden, nicht aber das Euro-Zeichen. Um das Euro-Zeichen dennoch fehlerfrei auszugeben, verwenden Sie einfach den HTML-Code &euro;!

Formulare

Normalerweise werden in ein HTML-Formular eingegebene Texte in dem Zeichensatz versendet, in dem die HTML-Seite dargestellt wird. Hat also beispielsweise die Erkennung des Unicodes-Zeichensatzes geklappt, dann sollten auch die eingegebenen Zeichen als Unicode versandt werden.

Was aber, wenn dies bei alten Browsern nicht zuverlässig funktioniert, wenn die Zeichensatzerkennung im Browser fehlgeschlagen ist oder im Browser ein bestimmter Zeichensatz fest eingestellt ist? Dann werden die Texteingaben aus dem Formular in einem anderen Zeichensatz zurückgeliefert und in der Folge falsch gespeichert.

Das folgende PDF-Dokument (die Zusammenfassung eines Vortrags über Internationalisierung und MySQL) schlägt vor, in Formulare ein hidden-Textfeld mit einer vorgegebenen Unicode-Zeichenkette einzubauen und vor der Formularverarbeitung zu kontrollieren, ob diese Zeichenkette korrekt übermittelt worden ist. Nach unseren Tests bleibt aber auch diese Kontrolle wirkungslos, wenn im Browser ein falscher Zeichensatz aktiv ist. In diesem Fall wird der Inhalt des hidden-Textfelds korrekt übertragen, die restlichen Eingabefelder enthalten aber dennoch falsch codierte Texte.

http://mysql.binarycompass.org/Downloads/Presentations/practical-i18n-oscon2004.pdf

HTTP-Protokoll

Das HTTP-Protokoll definiert, wie der Webbrowser und der Webserver miteinander kommunizieren, wie HTML-Dokumente und Formulardaten übertragen werden etc. Dieses Protokoll bietet neben dem HTML-<meta>-Tag die zweite Möglichkeit, den Zeichensatz einzustellen. Es wurde bereits erwähnt, dass sich die meisten Webbrowser auf die Information des HTTP-Protokolls verlassen, die Zeichensatzangabe im <meta>-Tag aber ignorieren.

Entscheidend für den Zeichensatz ist die Header-Information über den Dokumenttyp. Der HTTP-Header wird vor dem eigentlichen HTML-Dokument übertragen und ist daher nicht Teil des HTML-Codes. Einige Webbrowser bieten aber ein Kommando zur Anzeige der Seiteninformationen oder -eigenschaften an, aus denen auch die Header-Informationen hervorgehen (siehe Abbildung 1).

zeichensatz_01

Woher kommt nun die Header-Information über den Dokumenttyp samt Zeichensatz? Es bestehen folgende Möglichkeiten:

  • Apache-Defaulteinstellung (AddDefaultCharset utf-8 in httpd.conf)
  • Apache-Verzeichniskonfiguration (AddDefaultCharset in .htaccess)
  • PHP-Defaulteinstellung (default_charset="utf-8" in php.ini)
  • PHP-Code der betreffenden Seite:
<?php Header("Content-Type: text/html; charset=utf-8");
?>

Beachten Sie, dass die Header-Funktion am Beginn der PHP-Seite und vor jeder HTML-Ausgabe erfolgen muss!

Details zu den Konfigurationsmöglichkeiten von Apache und PHP folgen in den weiteren Abschnitten.

Webbrowser

Wie bereits erwähnt, ist es die Aufgabe des Webbrowsers, den Zeichensatz des Dokuments zu erkennen und das Dokument entsprechend korrekt anzuzeigen. Der Webbrowser kann dazu zwei Informationen auswerten: die HTTP-Header-Daten und das HTML-<meta>-Tag. Die meisten Browser berücksichtigen allerdings nur die Header-Informationen und ignorieren das <meta>-Tag.

Über die korrekte Erkennung des Zeichensatzes hinaus bestimmen noch zwei Faktoren die korrekte Darstellung der Seite:

  • Der Browser muss den Zeichensatz kennen. Das ist keineswegs immer der Fall. Sehr alte Browser haben beispielsweise keine Unicode-Unterstützung. Aber selbst moderne Browser können nicht alle Zeichensätze kennen - dafür gibt es viel zu viele. (latin1 alias iso-8859-1 und utf-8 bereitet natürlich keinem aktuellen Browser Probleme. Die meisten einigermaßen aktuellen Browser kommen auch mit latin9 alias iso-8859-15 zurecht.)
  • Der Browser muss Zugang zu Schriftarten haben, die die gewünschten Zeichen enthalten. Für die in Europa üblichen Zeichen ist das kein Problem. Es gibt aber nur sehr wenige Schriften, die alle in Unicode definierten Zeichen (also auch alle asiatischen Zeichen) enthalten.

Apache

Es bestehen mehrere Möglichkeiten, Apache mitzuteilen, welchen Zeichensatz er in der HTTP-Header-Information an den Browser übermitteln soll:

  • AddDefaultCharset Zeichensatz in httpd.conf: Apache übermittelt den hier angegebenen Zeichensatz (z.B. utf-8 oder iso-8859-1) für alle Seiten an den Browser. Die Einstellung gilt sowohl für .html- als auch für .php-Dateien. Das <meta>-Tag im HTML-Code wird ignoriert.
    Beachten Sie, dass einige Linux-Distributionen per Default AddDefaultCharset utf-8 verwenden. Wenn also Ihre latin1-Seiten fehlerhaft angezeigt werden, ist das der wahrscheinlichste Grund.
  • AddDefaultCharset off in httpd.conf: Apache wertet das <meta>-Tag aus und sendet den dort angegebenen Zeichensatz an den Browser. Es gilt also der Inhalt des <meta>-Tags.
  • AddCharset Zeichensatz .kennung in httpd.conf: Damit werden ein Zeichensatz für Dateien einer bestimmten Kennung eingestellt. AddCharset utf-8 .utf8 bewirkt also, dass für alle Dateien, deren Name auf .utf8 endet, als Zeichensatz utf-8 an den Browser gemeldet wird.
  • AddDefaultCharset und AddCharset in .htaccess: Die beiden Schlüsselwörter sind auch in .htaccess zulässig und ermöglichen so eine verzeichnisspezifische Konfiguration. Das ist praktisch, wenn Sie (z.B. bei einem ISP) keinen Einfluss auf httpd.conf haben.
    Beachten Sie aber, dass die Einstellungen in .htaccess nur berücksichtigt werden, wenn httpd.conf für das Webverzeichnis Veränderungen durch lokale Konfigurationsdateien zulässt (AllowOverride All oder FileInfo in der betreffenden <Directory>-Gruppe). Vorsicht: Die Defaulteinstellung für AllowOverride lautet oft None. Die .htaccess-Datei wird in diesem Fall vollständig ignoriert.

gears 128

PHP

Falls Sie einen anderen Zeichensatz als Unicode einsetzen, ist PHP momentan das schwächste Glied der Kette. Zwar ist PHP prinzipiell in der Lage, HTML-Dokumente in beinahe jedem Zeichensatz zu erzeugen. Funktionen wie echo oder print geben Zeichenketten einfach unverändert aus und kümmern sich dabei nicht um den Zeichensatz.

Zeichenkettenfunktionen

Das eigentliche Problem besteht aber darin, dass alle PHP-Zeichenkettenfunktionen davon ausgehen, dass die Zeichenketten den latin1-Zeichensatz verwenden. Wenn die Zeichenketten dagegen UTF-8-codiert sind,

  • liefert strlen die Anzahl der Bytes statt der Anzahl der Zeichen,
  • können Sie sich nicht auf die Ergebnisse der Kleiner- und Größer-Operatoren verlassen,
  • können Sie Zeichenketten-Arrays nicht zuverlässig sortieren,
  • können Sie sich auf die Ergebnisse wichtiger Funktionen wie stripslashes oder htmlspecialchars nicht mehr verlassen etc. Ganz auswegslos ist die Situation zum Glück auch nicht: PHP stellt die Funktionen utf8_encode und utf8_decode zur Verfügung, um Zeichenketten zwischen UTF-8 und ISO-8859-1 zu konvertieren. Falls PHP mit der iconv-Erweiterung kompiliert ist bzw. wenn diese Erweiterung als Modul aktiviert wird (unter Windows extension=php_iconv.dll in php.ini), stehen neben den Standardzeichenkettenfunktionen auch iconv-Varianten zur Verfügung. iconv_strlen($s, "UTF-8") ermittelt dann die tatsächliche Zeichenanzahl einer UTF-8-Zeichenkette. Noch mehr Zusatzfunktionen stellt die mbstring-Erweiterung zur Verfügung. Damit können Sie auch reguläre Ausdrücke auf Multibyte-Zeichenketten anwenden, E-Mails versenden etc.

Zeichensatz der PHP-Dateien

Die PHP-Dateien müssen in einem Zeichensatz vorliegen, der es dem PHP-Interpreter ermöglicht, die PHP-Sprachelemente korrekt zu erkennen. Das setzt voraus, dass zumindest die US-ASCII-Zeichen wie bei latin1 codiert sind. Diese Voraussetzung ist für UTF-8-Dateien zum Glück erfüllt.

HTTP-Zeichensatz-Header in php.ini einstellen

Per Default gibt der PHP-Interpreter keine HTTP-Header-Informationen zum Zeichensatz an Apache weiter und überlässt es somit dem Webserver, ob und welche Header-Zeichensatzdaten dieser an den Browser sendet.

Durch die Einstellung default_charset="utf-8" in php.ini können Sie dieses Verhalten ändern. Der PHP-Interpreter gibt nun den angegebenen Zeichensatz an Apache weiter. Dieser verändert die Informationen nicht mehr. Das heißt, die von PHP stammenden Informationen haben Vorrang gegenüber denen aus der Apache-Konfiguration!

HTTP-Zeichensatz-Header dynamisch einstellen

Sie können den gewünschten Header-Zeichensatz auch durch die PHP-Funktion header erzeugen. Das ermöglicht eine dokumentenspezifische Zeichensatzeinstellung. Die header-Funktion muss am Beginn der PHP-Seite aufgerufen werden (vor jeder HTML-Ausgabe!).

<?php header("Content-Type: text/html; charset=utf-8");
?>

Die durch die header-Funktion gesendeten Daten haben Vorrang sowohl gegenüber der default_charset-Einstellung als auch gegenüber der Apache-Konfiguration.

page_plus 128

MySQL

Geradezu vorbildlich ist die Zeichensatzunterstützung von MySQL - allerdings erst seit Version 4.1. Sie können nicht nur für den Server oder für eine Datenbank den gewünschten Zeichensatz einstellen, sondern auch für jede Tabelle und sogar für jede einzelne Spalte einer Tabelle. Es ist also möglich, in einer Tabelle eine Spalte mit latin1-Zeichenketten und eine zweite Spalte mit utf-8-Zeichenketten zu erzeugen.

MySQL unterstützt eine ganze Reihe verschiedener Zeichensätze, unter anderem ascii, binary, cp1250, greek, hebrew, latin1, latin2, latin5, latin7, ucs2 und utf8. In der Liste fehlt allerdings latin9. Das Euro-Zeichen können Sie daher nur in utf8- oder ucs2-Spalten speichern.

utf-8-Spalten weisen gegenüber latin1-Spalten momentan eine wesentliche Einschränkung auf: Die deutsche Sortierordnung wird nicht unterstützt. Die Sortierordnung utf8_general_ci ist zwar für viele deutschsprachige Anwendungen ebenfalls ausreichend, aber wenn Sie gemäß dem DIN-1- oder DIN-2-Standard sortieren möchten, müssen Sie bis auf weiteres bei latin1-Spalten bleiben.

Konfiguration des Defaultzeichensatzes

In der MySQL-Konfigurationsdatei my.cnf bzw. my.ini (Windows) können Sie mit default-character-set = latin1 den Defaultzeichensatz für den MySQL-Server einstellen (Optionsgruppe [mysqld]). Die Einstellung gilt für neue Datenbanken, Tabellen und Textspalten, soweit beim Erzeugen dieser Objekte nicht explizit ein anderer Zeichensatz angegeben wird.

Zeichensatztransformation durch die Client-Bibliotheken

Was nützt es, wenn der MySQL-Server selbst mit allen erdenklichen Zeichensätzen umgehen kann, der Client (also z.B. Ihr PHP-Programm oder der Kommandozeileninterpreter mysql) aber einen ganz bestimmten Zeichensatz voraussetzt? Die MySQL-Client-Bibliotheken wandeln daher automatisch alle Zeichenketten vom Zeichensatz des Clients in den Zeichensatz des Servers um (und umgekehrt).

Für welche Aspekte der Verbindung zwischen Client und Server welche Zeichensätze zum Einsatz kommen, wird durch mehrere MySQL-Systemvariablen gesteuert, die in der folgenden Tabelle zusammengefasst sind.

Variable Bedeutung
@@character_set_client Zeichensatz des Clients
@@character_set_server Defaultzeichensatz des Servers
@@character_set_connection Zeichensatz für die Verbindung zwischen Client und Server
@@character_set_results Gewünschter Zeichensatz für SELECT-Ergebnisse
@@character_set_database Defaultzeichensatz der Datenbank

Einige dieser Variablen können Sie in Ihrem Client-Programm verändern. Wenn Sie also beispielsweise PHP-Code schreiben, der UTF-8-Daten verarbeiten soll, sehen die entsprechenden Kommandos so aus (hier für die mysqli-Schnittstelle):

// mysql-Verbindung herstellen
$mysqli->query("SET @@session.character_set_client = 'utf8'");
$mysqli->query("SET @@session.character_set_results = 'utf8'");
$mysqli->query("SET @@character_set_connection = 'utf8'");

Nach diesen Vorarbeiten können Sie SQL-Kommandos mit UTF-8-Zeichenketten ausführen und erhalten SELECT-Ergebnisse ebenfalls im UTF-8-Format.

MySQL-Kommandos (mysql, mysqldump)

Die Kommandos mysql und mysqldump versuchen selbst zu erkennen, in welchem Zeichensatz Ein- und Ausgaben erfolgen sollen. Das gelingt manchmal, aber nicht immer. Manchmal müssen Sie daher mit der Option --default-character-set=latin1 oder =utf8 nachhelfen.

toolbox 128

MySQL-Administrationswerkzeuge (phpMyAdmin, Query Browser)

phpMyAdmin

Dieses Programm kommt verblüffend gut mit allen erdenklichen Zeichensätzen zurecht. Das Beispiel ist gewissermaßen der Beweis dafür, dass man mit PHP durchaus Unicode-taugliche Programme entwicklen kann. Zwei Tipps zur Bedienung:

  • Auf der Startseite von phpMyAdmin können Sie den Zeichensatz für die MySQL-Verbindung einstellen. Wählen Sie hier utf8_general_ci!
  • Wenn Sie mit phpMyAdmin *.sql-Dateien importieren bzw. ausführen, müssen Sie den Zeichensatz dieser Dateien angeben. (Per Default nimmt phpMyAdmin an, dass es sich um UTF-8-Dateien handelt.)

MySQL Query Browser

Erwartungsgemäß zeigt auch dieses Programm wenig Zeichensatzprobleme. Bei der aktuellen Linux-Funktion treten allerdings manchmal Schwierigkeiten bei der korrekten Interpretation von Eingaben auf. Beispielsweise hatte ich mehrfach Probleme, ein Euro-Zeichen in eine Tabelle mit Unicode-Spalten einzugeben.

Linux

Unter Linux steuern die Umgebungsvariablen LANG sowie LC_xxx, welcher Zeichensatz per Default gilt. Die meisten Programme und insbesondere alle Textkommandos halten sich an diese Einstellung. Einige aktuelle Distributionen verwenden mittlerweile UTF-8 als Defaultzeichensatz (z.B. Fedora, Red Hat, SUSE, nicht aber Mandrakelinux)!

Wo diese Variablen eingestellt werden, hängt von der Distribution ab (bei Red Hat und Fedora /etc/sysconfig/i18n, bei SUSE /etc/sysconfig/language). Manche Distributionen stellen auch komfortable Konfigurationswerkzeuge zur Verfügung, um den Zeichensatz zu verändern (bei SUSE das YaST-Modul SYSTEM|SPRACHE).

Info

Der Defaultzeichensatz gilt auch für den Editor, mit dem Sie Ihre PHP-Dateien erstellen. Wenn Sie, wie in diesem Artikel empfohlen, latin1 verwenden, sollten Sie auch den Linux-Defaultzeichensatz entsprechend einstellen. Andernfalls müssen Sie beim Aufruf des Editors immer darauf achten, dass alle *.php-Dateien im richtigen Zeichensatz gespeichert werden, was ebenso mühsam wie fehleranfällig ist.

Wenn Sie den Zeichensatz von Text- oder Codedateien nachträglich ändern möchten, helfen Ihnen dabei die Kommandos recode oder iconv. Die beiden folgenden Zeilen zeigen zwei alternative Möglichkeiten, um latin1-Dateien in utf8-Dateien umzuwandeln:

user$ recode latin1..u8 < latin1dat > utf8dat
user$ iconv -f latin1 -t utf-8 latin1dat >> utf8dat

Microsoft Windows

Unter Windows gibt es keine zentrale Einstellung für den Defaultzeichensatz. Das hat damit zu tun, dass reine Textdateien unter Windows eine viel geringere Rolle spielen als unter Unix/Linux. Sie müssen aber bei Ihrem Editor darauf achten, dass dieser die *.php-Dateien im richtigen Zeichensatz speichert.