UTF-8

Das häufigste Unicode Transformation Format

UTF-Algorithmen codieren / decodieren Unicode-Zahlen (max. 21 Bit Breite) für die praktische IT-Anwendung in Worte anderer Breite. Wie jede Codierung verlangt UTF zusätzlichen Rechen-Aufwand. Dafür wird der Speicherbedarf stark reduziert. UTF-8 codiert Zeichen in 1..3 Byte zu je 8 Bit.
Dieser Algorithmus ist heute die meist-verwendete Codierung für Unicode-Zeichen.
Zeichencodes PC-Codes für Buchstaben, Ziffern und Sonderzeichen
UTF Unicode Transformation Format - Familie
Live-Test Live Codierung und Decodierung von und nach UTF-8
UTF-8 Unicode-Zeichen in 8-Bit Worten: Prinzip, Geschichte, ...
Algorithmus Der Algorithmus von UTF-8, mit detaillierter Live-Demonstration
Codierung Unicode-Zeichen → UTF-8
Decodierung UTF-8 → Unicode-Zeichen, andere Codes
Dateien UTF-8 in Dateien
Datenbank UTF-8 in Datenbanken
Programmierung UTF-8 in Programmiersprachen (C/C++)

Live UTF-8 Test

Unicode-Text
Hex:
UTF-8 Code
Hex:
In diesem Live-Beispiel (oben) können sie Strings (Zeichenketten) von lesbarem Unicode-Text nach UTF-8 codieren und decodieren.
Geben sie ihr Text-Beispiel in das entsprechende Feld ein und klicken sie die Pfeil-Taste.
Sie erhalten Warnungen, wenn eine Änderung noch nicht durch Codierung oder Decodierung ausgeglichen wurde, oder wenn ein Text nicht druckbare Steuerzeichen (s.u.) enthält.
Sie können die Eingabe auch mit Kopieren | Einfügen durchführen.
Alle (!) Unicode-Zeichen können sie z.B. aus der → Unicode-Seite dieses Webs kopieren.
Zufallstexte aus der Nachbarschaft . .
Unicode-Tabellen zum Kopieren und Einsetzen:
Latin-1 (Westeuropa), Latin-2 (Osteuropa, slawische Sprachen), Griechisch, Cyrillisch, Hebräisch, Arabisch, ...

UTF-8   (8-Bit Unicode Transformation Format)

Unicode

ist der anerkannte Standard für die international eindeutige Codierung von Zeichen 'aller' Sprachen bzw. Schriften. Er verwendet (derzeit) max. 21 Bit. Von den theoretisch codierbaren >2 Mio Zeichen sind derzeit >100000 definiert. Gegenüber → ASCII- und → ISO-Codes benötigen Unicode-Zeichen daher mehr Speicherplatz.

UTF

bezeichnet eine ganze Familie von exakt umkehrbaren Algorithmen zur Codierung / Decodierung von → Unicode-Zeichen.
Die (derzeitige) offizielle Unicode-Wortbreite von 21 Bit ist für die IT nicht verwendbar. Die UTF-Algorithmen wandeln Unicode-Zeichen in andere 'brauchbare' Wortbreiten um. Die UTF-Varianten optimieren die beiden gegensätzlichen Anforderungen auf verschiedene Weise: Geschwindigkeit der Codierung / Decodierung, Bedarf an Speicherplatz. Allen Varianten gemeinsam ist die Fähigkeit, jedes beliebige Unicode-Zeichen zu codieren.

UTF-8

Ist ein exakt umkehrbarer Algorithmus zur Codierung aller Unicode-Zeichen in 8-Bit (=1 Byte) Worte. Je nach Häufigkeit der Zeichen werden 1..4 Byte für die UTF-8 Codierung verwendet.
UTF-8 ist in den Standards ISO/IEC 10646 und RFC 3629 definiert.

Der populärste UTF-Standard UTF-8 ist für die meisten in Europa, Nord- und Südamerika verwendeten Sprachen und Schriften optimiert: Besonders sparsam mit Speicherplatz und außerdem sehr schnell beim Codieren / Decodieren.
UTF-8 wurde 1992 von Ken Thompson und Rob Pike entwickelt und ist heute mit RFC 3629 als Standard definiert.

Tipp: Die Namen aller UTF-Varianten sind genormt, sie müssen genau in dieser Form verwendet werden.
In der UTF-Literatur wird öfters der Begriff 'octet' für eine Zahl 0..255 verwendet (=1 Byte).

Das Prinzip von UTF-8

Die Statistik der weltweit verwendeten Zeichen zeigt, dass die überwiegende Mehrzahl aus dem Code-Bereich 0x00...0x7F stammt (→ ASCII, → ANSI und alle → ISO-8859-Varianten).

Das legt den Gedanken nahe, diese nur 128 dominierenden Zeichen U+00..U+7F besonders sparsam und schnell mit 1 Byte zu codieren.

Mit den weiteren 1920 Zeichen U+080..U+7FF werden alle bedeutenden Sprachen in Europa, Australien, Nord- und Südamerika und in Russland erfasst, inkl. Arabisch, Hebräisch, Kyrillisch und Griechisch. In diese Gruppe fallen auch die deutschen Sonderzeichen ÄÖÜäöüß
Sie alle werden mit 2 Byte UTF-8 codiert - Das ist ein ausgezeichneter Kompromiss, wenn man bedenkt, dass diese Sprachen damit erstmals weltweit eindeutig codiert sind und gleichzeitig (!) in Dokumenten verwendet werden können.

Weitere 63488 Zeichen U+0800..U+FFFF werden (derzeit) noch vergleichsweise seltener verwendet und mit 3 Byte UTF-8 codiert.
Damit werden auch die wichtigen Zeichen der Sprachen Asiens und Indiens erfasst. Darüber hinaus ist Platz für mathematische Zeichen und zahlreiche Symbole, darunter das €-Zeichen.
Alle gängigen Betriebssysteme und die meisten gängigen Programme unterstützen Unicode und UTF-8 bis zu dieser Grenze.

Weitere 2 Mio Zeichen U+10000..U+1FFFFF kann man mit 4 Byte UTF-8 codieren. Das wird von derzeitiger Software allerdings noch wenig unterstützt.
Bis hierher reicht (derzeit) der Definitions-Bereich von Unicode.
Diese Grenze ist allerdings willkürlich und wird wahrscheinlich - so wie alle derartigen Grenzen in der IT - nach einigen Jahren belächelt und überschritten werden.

Weitere 65 Mio Zeichen U+200000..U+3FFFFFF kann man (nach dem gleichen Algorithmus !) mit 5 Byte UTF-8 codieren. Das stellt eine Reserve des Algorithmus dar, zusammen mit weiteren 2 Mia (!) Zeichen U+4000000..U+7FFFFFFF mit 6 Byte UTF-8 Code.
Die Entwicklung der Hardware geht in diesem Fall voran - Die Wortbreite gängiger PC wurde zuletzt von 32 Bit (4 Byte) auf 64 Bit (8 Byte) erweitert.

Eine besonders wichtige Eigenschaft ist die Mischbarkeit der verschiedenen UTF-8 Codes:
Ohne jeden zusätzlichen Aufwand kann man z.B. die zahlreichen 1-Byte Codes mit den weniger häufigen 2-Byte Codes und den seltenen 3-Byte Codes mischen.
Selbst dann, wenn beim Speichen oder Übertragen von UTF-8 Texten einzelne Fehler auftreten, sind davon nur 1-2 Zeichen betroffen - Mit Beginn des nächsten folgenden Zeichens arbeitet der Algorithmus wieder richtig.
Viele Protokolle, die ursprünglich nur → ASCII verwendeten, unterstützen heute UTF-8, obwohl teilweise noch nicht 'offiziell' so definiert:
FTP, GO (CNRP), IMAP (modifizierter UTF-7 Code), URN, ...

UTF-8 ist die Standard-Codierung der rasch wachsenden → XML-Familie.

UTF-8 kann man auch zur Codierung / Decodierung von → EBCDIC verwenden, allerdings sind derart codierte Daten trotzdem nicht zwischen → Unicode- und → EBCDIC-Systemen kompatibel.
Die Programmiersprache → Perl verwendet UTF-8 zur internen Darstellung von Text-Zeichen.

Die Programmiersprache → Java verwendet zwar zur internen Zeichen-Darstellung → UTF-16, unterstützt jedoch auch 'modified UTF-8', eine in wenigen Details geänderte Variante.

Alle gängigen → Datenbank-Programme können UTF-8 verwenden.

Der UTF-8 Algorithmus

Der Algorithmus verwendet → Umschalt-Codes. Das bedeutet: Die Codierung in kleinere Worte erfordert zusätzliche Daten.
Ein besonderer Vorteil ist die variable Anzahl von Bytes pro Zeichen: Häufig verwendete Zeichen (ASCII-Bereich) benötigen nur 1 Byte, seltener verwendete 2...6 Bytes.

Die Tabelle rechts zeigt den systematischen Aufbau:

Der 1-Byte Code enthält als Bitmuster nur ein führendes 0-Bit, danach 7 nutzbare Datenbits. Das ergibt einen Code-Bereich von U+00...U+7F

Alle MultiByte Codes beginnen mit einem spezifischen Bitmuster, danach unterschiedlich viele Folge-Bytes. Jedes Folge-Byte enthält das Bitmuster 10 und 6 nutzbare Datenbits. Die Tabelle zeigt die sich ergebenden Code-Bereiche.
Der Algorithmus ist systematisch aufgebaut:
Jedes Byte enthält am Anfang (höchstwertige Bits) ein eindeutiges Bitmuster, danach eine Anzahl nutzbarer Daten-Bits
Anzahl
Bytes
StartByte
Bitmuster
Nutzbare
Datenbits
Code vonCode bis
107 + 0*6 = 7U+0000U+007F
21105 + 1*6 = 11U+0080U+07FF
311104 + 2*6 = 16U+0800U+FFFF
4111103 + 3*6 = 21U+010000U+1FFFFF
51111102 + 4*6 = 26U+0200000U+3FFFFFF
611111101 + 5*6 = 31U+04000000U+7FFFFFFF
711111110 0 + 6*6 = 36U+80000000U+FFFFFFFFF
Folge10je 6  

Die Tabelle geht über die derzeit definierte Grenze von 21 Bit weit hinaus und zeigt das enorme Potential des UTF-8 Algorithmus: Jeder der angegebenen Codes hat in einem einzigen Speicher-Wort (8 Byte) eines modernen PC Platz. Mit 1..7 Byte könnte man ca. 69 Mia Zeichen UTF-8 codieren.
Die Tabelle rechts zeigt, welche Werte die Bytes des UTF-8 Code annehmen können. Das UTF-8 Bitmuster ist rot markiert.

Aus dem Bitmuster ergibt sich eindeutig, um welche Art von Code-Byte es sich handelt.
Insgesamt 4 der 256 möglichen Werte sind illegal.

Der Bereich der 5-Byte und aller längeren Codes befindet sich ausserhalb der (derzeitigen) Unicode-Definition und stellt eine Reserve des Algorithmus für Unicode-Erweiterungen dar.

Der Bereich der 4-Byte Codes ist gültig, wird jedoch derzeit noch wenig unterstützt - neue Entwicklungen sollten 4-Byte UTF-8 unbedingt bereits berücksichtigen.
Bitmuster und Byte-Werte in UTF-8 Code:
Bytevonbisvonbis
1-Byte 00000000 01111111 0x000x7F
Folge 10000000 10111111 0x800xBF
Illegal 11000000 11000001 0xC00xC1
2-Start 11000010 11011111 0xC20xDF
3-Start 11100000 11101111 0xE00xEF
4-Start 11110000 11110111 0xF00xF7
5-Start 11111000 11111011 0xF80xFB
6-Start 11111100 11111101 0xFC0xFD
7-Start 11111110 11111110 0xFE0xFE
Illegal 11111111 11111111 0xFE0xFF

Steuerzeichen

Jede Software, die sowohl mit UTF-8 als auch mit 1-Byte Codes arbeitet, kann zu einem 'Steuerzeichen-Problem' beitragen. Besonders betroffen sind die meisten gängigen Editor-Programme.

Im 1-Byte → ASCII Code gibt es 'nicht druckbare' Steuerzeichen im Bereich 0x00...0x1F und das DEL-Steuerzeichen 0x7F
Einige dieser Zeichen (z.B. 0x09=Tab, 0x0A=LF und 0x0D=CR ) sind häufig und wichtig.
Das stellt normalerweise kein Problem dar, denn diese Steuerzeichen werden mit oder ohne UTF in gleicher Weise verwendet.

Im 1-Byte → ISO-8859 Code gibt es einen 32 Zeichen langen Bereich von nicht druckbaren Steuerzeichen 0x80...0x9F . Diese Byte-Werte treten in ca. 50% aller UTF-8 Folge-Bytes auf.
Viele Editoren haben Probleme mit der Darstellung dieser 'Zeichen'. Es muss sich daher nicht um einen Code-Fehler handeln, wenn manche UTF-8 Folge-Bytes nicht angezeigt werden. Noch schlimmer ist der Fall, wenn die verwendete Software durch die Anzeige solcher Sonderzeichen 'durcheinander kommt', jedoch nicht abstürzt. Das kann zu fehlerhafter Anzeige führen, Fehler können auch in die Daten gelangen.
Vorsicht beim Kopieren und Einsetzen von UTF-8 Code !
Testen sie im Zweifel das Verhalten ihrer Software.

Im 1-Byte 'ANSI'-Code wird der Bereich 0x80...0x9F teilweise für die gleichen Steuerzzeichen verwendet, teilweise für Zeichen mit ganz anderen Unicodes.
Details dazu auf der Seite → ASCII/ANSI.
Wenn ein UTF-8 Folge-Byte zufällig auf eines der 5 Sonderzeichen dieses Bereichs trifft, dann kann es die oben erwähnten Probleme mit der Darstellung geben. Noch schlimmer ist der Fall, wenn die Software in bestimmten Fällen die beiden Zeichencodes vermischt:
MS-Programme neigen dazu, Texte ungefragt im firmen-eigenen → CP-1252 Code ('ANSI') anzuzeigen. Wenn solche Daten weiter verarbeitet werden, können die Daten zahlreiche Fehler enthalten !
Testen sie im Zweifel das Verhalten ihrer Software, insbesondere bei Zusammenarbeit mehrerer Teile (z.B. von PHP, HTML und Javascript auf einer Webseite !).

Der Text der Zeile 'UTF-8' in der folgenden Tabelle ist im Quelltext HTML-codiert wie z.B. Ã für das Byte 0xC3
Diese Bytes werden von den meisten Browsern im 'ANSI'-Zeichensatz angezeigt, der hier keine Steuerzeichen aufweist und sind daher sichtbar.
→ Javascript verwendet Unicode - Die gleichen (!) Zeichen mit Javascript eingesetzt ergeben oft überraschende Resultate, je nach Betriebssystem, Browser und Version !

Zum Test eignen sich u.a. die deutschen Umlaute. Sie ergeben bei UTF-8 Codierung Folge-Bytes innerhalb (rot) und außerhalb der Steuerzeichen 0x80...0x9F
ZeichenÄÖÜ ßäöü
UnicodeU+C4U+D6U+DC U+DFU+E4U+F6U+FC
UTF8-Hex C384 C396 C39C C39F C3 A4C3 B6C3 BC
UTF-8 à à Ü ß äöü

Byte Order Mark (BOM):

Optional werden am Anfang einer UTF-8 Datei die 3 Bytes EF BB BF als Kennzeichen für UTF-8 eingefügt.
Das BOM sitzt noch vor der ersten Text-Zeile wie z.B.
<?xml version="1.0" encoding="UTF-8" ?>
Leider gibt es derzeit sowohl Programme, welche dieses BOM vorschreiben (z.B. die Datenbank FileMaker) als auch solche, die auf ein UTF-8 BOM falsch oder fehlerhaft reagieren (wie z.B. die shebang-Zeile #! am Anfang von Linux Shell-Script Programmen).

In M$-Systemen werden UTF-8 Dateien mit dem BOM und der Datei-Endung .txt richtig erkannt und interpretiert.
Auch einige Editor-Programme (z.B. vim / Linux und Notepad++ / Windows) reagieren richtig auf das BOM.
M$ Frontpage hat bis Version <2002 Probleme mit Unicode und BOM. Ohne spezielle Anweisung verwendet Frontpage immer den firmen-eigenen Zeichensatz → CP-1250. Ab Version 2002 wird sowohl ein BOM erkannt als auch Deklarationen, z.B.
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<?xml version="1.0" encoding="utf-8"?>
Frontpage scheint selbst nie ein BOM zu erzeugen, ein vorhandenes BOM wird jedoch offenbar weiter verwendet.
Live-Demo des Algorithmus mit einem einzelnen Unicode-Zeichen: Bits in roter Schrift sind fix vorgegeben, die nutzbaren Bits (schiefergrau) können live geändert werden. Geben sie eine Code-Zahl ein (0..65535 oder 0x0000...0xFFFF oder U+0000...U+FFFF), oder klicken sie den Würfel für eine Zufallszahl. Mit den Pfeilen ändern sie die Code-Zahl jeweils um +/- 1.
  Code-Zahl
UTF-8 Code:   X
A
123.
#XX
1010 1010
0101 1010
1101 1010
1110 1010
#XX
321.
B
123.
#XX
1010 1010
1010 1010
#XX
321.
B
 
1010 1010
#XX
321.
B
       
Auf der linken Seite das zu codierende Unicode-Zeichen, von links nach rechts als
Zeichen, Dezimalzahl, Hexadezimal-Zahl, Bitmuster (Binärzahl)
Oben das 1.Byte, darunter ein allfälliges 2.Byte.
Auf der rechten Seite der UTF-8 Code, von links nach rechts als
Bitmuster (Binärzahl), Hexadezimal-Zahl, Dezimalzahl und Zeichen (evtl. nicht darstellbar !)
Oben das Start-Byte, darunter allfällige Folge-Bytes.

UTF-8 Codierung

Algorithmus zur Codierung Unicode → UTF-8 (ohne Gewähr):

Nur bei der Ausgabe an eine Datei beginnt der UTF-8 Code mit dem Byte Order Mark (↑ BOM) EF BB BF

Je nach Zeichen-Code wird einer von 3 Algorithmen verwendet. Die Unicode-Bits werden von Lo nach Hi eingesetzt, nicht verwendete Hi-Bits werden 0 gesetzt.

Zeichen 0..127 (U+0000..U+007F, → ASCII-Bereich) werden mit 1 Byte codiert. Dieses Byte beginnt immer mit binär 0 (MSB).

Zeichen 128..2047 (U+0080..U+07FF) werden mit 2 Byte codiert.
Das 1. Byte beginnt immer mit binär 110 und enthält danach die oberen 5 Bit der Daten zur Codierung.
Das Folge-Byte beginnt immer mit binär 10 und enthält danach die unteren 6 Bit der Daten zur Codierung.

Zeichen 2048..65535 (U+0800..U+FFFF) werden mit 3 Byte codiert.
Das 1. Byte beginnt immer mit binär 1110 und enthält danach die oberen 4 Bit der Daten zur Codierung.
Die beiden Folge-Bytes beginnen immer mit binär 10 und enthalten danach je 6 Bit der Daten zur Codierung.

Damit ergeben sich zulässige Byte-Werte 0..247 ( #00..F7 ), die frei miteinander gemischt werden können: Zwischen mehreren 1-Byte Codes können daher einzelne 2-Byte Codes stehen usw.
Dieser Algorithmus wurde analog bis zu 31-Bit Zeichen (U+7FFFFFFF) entwickelt, die 6 Bytes Code erfordern. Der Standard RFC 3629 (2003) beschränkt UTF-8 derzeit auf Zeichen bis U+10FFFF
Von heute gängiger Software wird UTF-8 meistens bis U+FFFF unterstützt.
Fehler:
Nicht alle Byte-Folgen sind nach UTF-8 zulässig. Ein spezieller Fall, 'überlange Codes' (overlong forms) wurde von Hackern z.B. zum Überlisten des IIS-Servers von M$ eingesetzt.
Die Standard-Reaktion von Programmen bei Auftreten von Fehlern ist Abbruch / Fehlermeldung.
Programme wie z.B. Browser sind jedoch besonders 'tolerant' erstellt und ignorieren meistens allfällige UTF-Fehler.
Das → Javascript-Beispiel (vereinfacht, ohne Gewähr) wird für die UTF-8 Live-Demo auf dieser Webseite verwendet. Das Beispiel lässt sich leicht auf andere gängige Programmiersprachen übertragen.
function string_to_utf8(str) {
var utf8="";
for(var i=0;i<str.length;i++) {
utf8+=char_to_utf8(str.charAt(i));
}
return utf8;
}

function char_to_utf8(c) {
var utf8="";
if(c.length) {
var uc=c.charCodeAt(0);
if(uc<128) {utf8=String.fromCharCode(uc);}
else if((uc>127) && (uc<2048)) {
utf8+=String.fromCharCode((uc>>6)|192);
utf8+=String.fromCharCode((uc&63)|128);
}
else {
utf8+=String.fromCharCode((uc>>12)|224);
utf8+=String.fromCharCode(((uc>>6)&63)|128);
utf8+=String.fromCharCode((uc&63)|128);
}
}
return utf8;
}
Die Arbeit wird am besten auf 2 Funktionen (String und Character) verteilt, so wie hier gezeigt. Jedes Zeichen aus jedem Zeichensatz lässt sich in den weltweit eindeutigen Unicode übersetzen und damit auch UTF-8 codieren.
Das → Basic (VBA)-Beispiel (vereinfacht, ohne Gewähr) kann z.B. als Ersatz der fehlenden Option zum Speichern von Text aus MS-Word in UTF-8 verwendet werden. Die in VBA fehlenden Bit-Level Funktionen werden ersetzt:
Function string_to_utf8(str as String) As String
Dim i As Integer
Dim utf As String
utf = ""
For i = 1 To Len(str)
utf = utf & chr_to_utf8(Mid(str,i,1))
Next
string_to_utf8 = utf
End Function

Function chr_to_utf8(ByVal c As String) As String
Dim uc As Long
Dim utf As String
utf = ""
uc = AscW(c)
If uc < 0 Then uc = uc& + &H10000
If (uc < 128) Then
If (uc=&H0B Or uc=&H0D) Then
utf = Chr(&H0D) & Chr(&H0A)
Else
utf = c
End If
ElseIf (uc < 2048) Then
utf = utf & Chr((uc\64) + 192)
utf = utf & Chr((uc Mod 64) + 128)
Else
utf = utf & Chr((uc\4096) + 224)
utf = utf & Chr((uc\64) Mod 64 + 128)
utf = utf & Chr((uc Mod 64) + 128)
End If
chr_to_utf8 = utf
End Function
Der in grüner Schrift gehaltene Teil codiert abweichend vom UTF-8 Algorithmus die beiden Word-Zeichen #0B (Zeilenumbruch) und #0D (Absatz-Trennung) mit den üblichen Text-Zeichen #0D0A (CR/LF) für Zeilenumbruch.
Die Programmiersprache → PHP bietet zwar zahlreiche Funktionen zur Codierung, Decodierung und Verarbeitung von MultiByte-Strings, diese sind jedoch z.T. schlecht dokumentiert und überschneiden einander oft. Überdies wird offenbar überall vorausgesetzt, dass bereits Strings existieren. Ich habe keine Funktion gefunden, die es erlaubt, ein Unicode-Zeichen durch schlichte Angabe des Codes zu erzeugen.

Rechts ein Funktions-Muster (ohne Gewähr) für den Bereich U+0000..U+FFFF
Darunter sehen sie, wie die Funktion zur Erzeugung von UTF-8 Strings eingesetzt werden kann. Hier wird das greichische alpha (U+3B1) erzeugt und anschließend mit der Funktion utf8_to_html() (↓ Decodierung) auf einer Webseite ausgegeben.
function ucnr_to_utf8($ucnr) {
// Code-Zahl -> UTF-8 String
$utf8str='';
$ucnr=floor($ucnr);
if($ucnr<0) {$utf8str.='?';}
elseif($ucnr<128) {$utf8str.=chr($ucnr);}
elseif($ucnr<2048) {
$utf8str.=chr(floor($ucnr/64)+192);
$utf8str.=chr(($ucnr%64)+128);
}
elseif($ucnr<65536) {
$utf8str.=chr(floor($ucnr/4096)+224);
$utf8str.=chr((floor($ucnr/64))%64+128);
$utf8str.=chr(($ucnr%64)+128);
}
else {$utf8str="?";}
return $utf8str;
}
Anwendung:
$s = 'A'.ucnr_to_utf8(0x3B1).'Z';
print utf8_to_html($s);
Ausgabe:
AαZ
Das Beispiel für die Programmiersprache → C/C++ arbeitet etwas abweichend von den übrigen Beispielen, weil Strings in C/C++ anders verwendet werden:

Das Demo-Programm main() erzeugt eine Text-Datei utf_test.txt mit 3 Zeilen UTF-8 Text.
Diese Datei wird mit allen gängigen Text-Editor-Programmen korrekt angezeigt.

Mit der ersten fprintf() Anweisung wird das ↑ BOM eingetragen.

In die 1. Zeile werden die beiden Standard ASCII-Zeichen AZ geschrieben. Der String str wird dazu gelöscht und die Bytes einzeln mit Funktion int_to_utf8() codiert. Das Ergebnis wird im String str gesammelt und zuletzt mit fprintf() ausgegeben.

In der 2. Zeile werden die beiden deutschen Umlaute ÄÜ mit je 2 Byte UTF-8 codiert. Sie können den String str auch durch beliebige andere Maßnahmen ergänzen.

In der 3. Zeile werden die griechischen Zeichen αω mit je 2 Byte und das €-Zeichen mit 3 Byte UTF-8 codiert.

Funktion int_to_utf8() erwartet als Argumente einen String-Pointer (zur Aufnahme des Ergebnisses) und eine ganze Zahl (den zu verarbeitenden Unicode). Die Funktion gibt die Anzahl der nach Codierung im String enthaltenen Bytes zurück.

Abweichend von den Beispielen anderer Programmiersprachen wird der erzeugte Code an einen bereits bestehenden String angefügt, welcher als Speicher dient und eine beliebige Anzahl von Bytes aufnehmen kann. Der String wird vom aufrufenden Programm als Pointer übergeben und muss von diesem ausreichend dimensioniert werden.

Die UTF-8 Codierung folgt dem gleichen Algorithmus wie die übrigen Beispiele.

Die Funktion fügt nach dem UTF-8 Code ein 0-Byte ein. Der String ist daher nach jeder Anwendung der Funktion zur Ausgabe bereit.
C/C++ Programm-Beispiel zum Schreiben einer UTF-8 Text-Datei:
#include <stdio.h>
#include <string.h>
int int_to_utf8(char*,unsigned int);

int main() {
char path[80],str[80];
FILE *fhw;
strcpy(path,"/home/ich/utf_test.txt");
// strcpy(path,"C:\\Daten\\utf_test.txt");
fhw = fopen(path,"w");
fprintf(fhw,"\xEF\xBB\xBF");   // BOM

str[0]=0;
int_to_utf8(str,65);   // A
int_to_utf8(str,90);   // Z
fprintf(fhw,"%s\n",str);

str[0]=0;
int_to_utf8(str,0xC4);   // Ae
int_to_utf8(str,0xDC);   // Ue
fprintf(fhw,"%s\n",str);

str[0]=0;
int_to_utf8(str,0x3B1);   // alpha
int_to_utf8(str,0x20AC);   // euro
int_to_utf8(str,0x3C9);   // omega
fprintf(fhw,"%s\n",str);

fclose(fhw);
return 0;
}

int int_to_utf8(char *t,unsigned int iuc) {
unsigned int ilen;
ilen = strlen(t);
if(iuc<128) {
t[ilen++] = iuc;
}
else if(iuc<2048) {
t[ilen++] = (iuc>>6) | 192;
t[ilen++] = (iuc&63) | 128;
}
else{
t[ilen++] = (iuc>>12) | 224;
t[ilen++] = ((iuc>>6) & 63) | 128;
t[ilen++] = (iuc & 63) | 128;
}
t[ilen] = 0;
return ilen;
}

UTF-8 Decodierung

Algorithmus zur Decodierung UTF8 → Unicode (ohne Gewähr):

Nur Zeichen 0..247 ( #00..F7 ) sind zulässig, Zeichen 248..255 ( #F8..FF ) sind illegal.

Zeichen 0..127 (→ ASCII-Bereich, #00..7F) werden ohne Umwandlung direkt verwendet.
Zeichen 128..191 (#80..BF) sind Folge-Bytes. Sie dürfen nur nach einem der nachfolgend aufgezählten Start-Bytes auftreten.
Zeichen 192..223 (#C0..DF) bezeichnen den Beginn einer 2-Byte-Folge. Das folgende Byte muss ein Folgebyte (s.o.) sein.
Zeichen 224..239 (#E0..EF) bezeichnen den Beginn einer 3-Byte-Folge. Die beiden folgenden Bytes müssen Folgebytes (s.o.) sein.
Auch das ↑ BOM ( EF BB BF ) enthält daher legale Zeichen.
Zeichen 240..247 (#F0..F7) bezeichnen den Beginn einer 4-Byte-Folge. Die 3 folgenden Bytes müssen Folgebytes (s.o.) sein.
Decodierung einer 2-Byte-Folge:
Isoliere aus dem Startbyte die niedrigsten 5 Bit und verschiebe sie um 6 Bit nach links.
Isoliere aus dem Folgebyte die niedrigsten 6 Bit.
ODER-verknüpfe die 2 Bytes zum Ergebnis.

Decodierung einer 3-Byte-Folge:
Isoliere aus dem Startbyte die niedrigsten 4 Bit und verschiebe sie um 12 Bit nach links.
Isoliere aus dem 1. Folgebyte die niedrigsten 6 Bit und verschiebe sie um 6 Bit nach links.
Isoliere aus dem 2. Folgebyte die nierdigsten 6 Bit.
ODER-verknüpfe die 3 Bytes zum Ergebnis.

Bit-Ebene

Zur Codierung werden Funktionen bzw. Operatoren auf → Bit-Ebene benötigt.
Falls eine Programmiersprache diese nicht bietet, dann kann man diese Funktionen durch Arithmetik ersetzen:
Die Isolierung von Bits erfolgt durch die "bitwise AND"-Funktion. Sie wird durch die → Modulo-Funktion ersetzt.
Die Links-Verschiebung (left-shift) wird durch Multiplikation mit einem Vielfachen von 2 ersetzt.
An Stelle der ODER-Verknüpfung (bitwise OR) wird die Addition verwendet.

Unicode-Zeichen ohne Äquivalent:

Ideal zur Unicode-Ausgabe geeignet ist u.a. → XML bzw. → HTML, weil man damit jedes Unicode-Zeichen weltweit eindeutig codieren und (z.B. auf Webseiten) darstellen kann.

Bei anderen Zeichencodes mit kleinerem Umfang (z.B. → ISO-8859-1) treten nicht übersetzbare Zeichen auf, z.B. 'slawische' Zeichen wie Čœřŝž
Derartige Zeichen werden manchmal durch andere Zeichen 'angenähert', z.B. Cörsz das erfordert jedoch aufwändige Programme und trifft dennoch daneben.
Im Zweifel werden sie am besten mit dem Zeichen ? decodiert.
Das → Javascript-Beispiel (vereinfacht, ohne Gewähr) wird für die Live-Decodierung von UTF-8 auf dieser Webseite verwendet. Das Beispiel lässt sich leicht auf andere gängige Programmiersprachen übertragen.
function utf8_to_string(utf) {
var str="";
var o1=o2=o3=i=0;
while(i<utf.length) {
o1=utf.charCodeAt(i);
// direkt codiert (1-Byte)
if (o1<128) {
str+=String.fromCharCode(o1);
}
// Fehler
else if(o1<192) {str+="?";}
// 2-Byte UTF-8: U+0080..U+07FF
else if(o1<224) {
o2=utf.charCodeAt(i+1);
str+=String.fromCharCode(((o1&31)<<6) | (o2&63));
i++;
}
// 3-Byte UTF-8: U+0800..U+FFFF
else if (o1<240) {
o2=utf.charCodeAt(i+1);
o3=utf.charCodeAt(i+2);
str+=String.fromCharCode(((o1&15)<<12) | ((o2&63)<<6) | (o3&63));
i+=2;
}
// Fehler
else {str+="?";}
i++;
}
return str;
}
Dieser Code lässt sich analog auf weitere Unicode-Bereiche mit eher zukünftiger Bedeutung ausdehnen, z.B. 4-Byte UTF-8 für U+10000..U+1FFFFF.
Das → PHP-Beispiel (vereinfacht) kann man z.B. zum Transfer von Text aus einer UTF-codierten Datenbank auf eine Webseite verwenden. Die in PHP fehlenden Bit-Level Funktionen werden ersetzt.
Verschiedene PHP-Module bieten Funktionen ähnlicher Funktionalität, die jedoch bei Tests nicht immer wunschgemäß funktioniert haben. Dieses Beispiel erzeugt aus allen UTF-8 Zeichen sauberen HTML-Code (ohne Gewähr):
function utf8_to_html($s) {
$h="";
$i=0;
while($i<strlen($s)) {
$c1=substr($s,$i,1);
$o1=ord($c1);
// direkt codiert (1-Byte)
if($o1<32) {
if($o1==9) {$h.=' ';}
elseif($o1==10) {$h.="<br />\n";}
}
elseif($o1<128) {
$h.=htmlentities($c1);
}
// Fehler
elseif($o1<192) {$h.="?";}
// 2-Byte UTF-8: U+0080..U+07FF
elseif($o1<224) {
$o2=ord(substr($s,$i+1,1));
$uc=($o1-192)*64 + $o2-128;
$h.="&#$uc;";
$i++;
}
// 3-Byte UTF-8: U+0800..U+FFFF
elseif($o1<240) {
$o2=ord(substr($s,$i+1,1));
$o3=ord(substr($s,$i+2,1));
$uc=($o1-224)*4096 + ($o2-128)*64 + $o3-128;
$h.="&#$uc;";
$i+=2;
}
// Fehler
else {$h.="?";}
$i++;
}
return $h;
}
Die in grüner Schrift gehaltenen Teile codieren das fertig decodierte Zeichen $uc für XML oder HTML.
Beispiele:
Das 1-Byte-Zeichen U+3C wird z.B. in &lt; codiert, das ergibt auf einer Webseite die korrekte Anzeige des Zeichens <
Andernfalls würde dieses Zeichen als HTML-'Programm' aufgefasst und einen Fehler verursachen.
Der 2-Byte UTF-8 Code #C384 bezeichnet das Zeichen Ä und wird in &#196; codiert. Das ergibt auf jeder Webseite die gleiche korrekte Anzeige des Zeichens Ä
Details zur HTML-Codierung von Zeichen.
Das Beispiel für die → Programmiersprache C/C++ arbeitet etwas abweichend von den übrigen Beispielen, weil Strings in C/C++ anders verwendet werden:

Demo-Programm main()
Eine UTF-8 Text-Datei utf_test.txt wird geöffnet und wie üblich zeilenweise gelesen. Das Programm muss seine Funktion danach richten, was mit dem decodierten Text geschehen soll. In diesem Beispiel wird der Text zu einer ganzen Zahl (Unicode) decodiert, anschließend als → XML-Entity codiert und ausgegeben.

(Nur) In der 1. Zeile wird mit Funktion check_bom() geprüft, ob ein BOM eingetragen ist, und dieses allenfalls entfernt.

Danach wird der UTF-8 Text jeder Zeile in der String-Variablen str gelesen und an Funktion utf8_decode() übergeben. Das Ergebnis (Anzahl der Ergebnis-Zeichen) wird nach der Zeilen-Nummer ausgegeben.
Anschließend wird der decodierte → XML- bzw. → HTML-konforme Text ausgegeben.

Funktion check_bom() erhält den Text einer Zeile als String-Pointer.
Sie gibt eine ganze Zahl [0,1] zurück, je nachdem, ob das BOM gefunden wurde oder nicht.
Ein vorhandenes BOM wird aus dem String entfernt, damit dieser weiter decodiert werden kann.

Funktion utf8_decode() decodiert einen UTF-8 codierten String, der als Pointer übergeben wird. Das decodoerte Ergebnis wird als XML-konformer Text in den gleichen String eingetragen, eine ganze Zahl mit der Länge des Ergebnis-Strings in Byte wird zurückgegeben.

Der erhaltene String s wird in den lokalen String-Buffer t kopiert und dort aufgearbeitet.
Die Ergebnis-Bytes werden schrittweise in den String s eingetragen, der neu aufgebaut und zuletzt mit einem 0-Byte abgeschlossen wird.

Der Algorithmus zur UTF-8 Decodierung folgt den übrigen Beispielen dieser Seite.
Je nach Bedarf werden 1..3 Bytes an die Variablen ic0, ic1, ic2 übergeben.
Einzelne ASCII-Bytes werden direkt ausgegeben.
2 oder 3 UTF8-Bytes werden in der Variablen iuc decodiert.
An dieser Stelle kann man die Funktion ändern, um den fertig decodierten Unicode iuc (rot hervorgehoben) beliebig zu verwenden.
Im Beispiel wird der Unicode mit der → Standard-Funktion sprintf() in einen → XML-Entity String umgewandelt, an den lokalen String-Buffer h übergeben und mit Standard-Funktion strcat() an den Ergebnis-String s angehängt. Dabei wird auch das abschließende 0-Byte eingetragen.

Die while-Schleife wird abgebrochen, wenn im Eingangs-String ein 0-Byte gefunden wird (ic0==0).
Zur Sicherheit wird die Schleife spätestens nach 100 Bytes abgebrochen. Setzen sie diese Grenze und die Größe des Buffer-Strings zur praktischen Anwendung hinauf.

Nach erfolgter Decodierung wird die aktuelle Länge des Ergebnis-Strings s an die Variable j zugewiesen. Ihr Wert-1 wird zuletzt als Gesamt-Länge des Ergebnis-Strings an das aufrufende Programm zurückgegeben.
C/C++ Programm-Beispiel zum Lesen einer UTF-8 Text-Datei:
#include <stdio.h>
#include <string.h>
int check_bom(char*);
int utf8_decode(char*);

int main() {
int ilen,iline;
char path[80],str[80];
FILE *fhr;
strcpy(path,"/home/ich/utf_test.txt");
// strcpy(path,"C:\\Daten\\utf_test.txt");
fhr=fopen(path,"r");
iline=0;
while (!feof(fhr)) {
str[0]=0;
fgets(str,sizeof(str),fhr);
if(!iline) {
if(check_bom(str)) {printf("# BOM #\n");}
}
ilen=utf8_decode(str);
printf("[line %d]: str[len=%d] = %s",iline++,ilen,str);
}
fclose(fhr);
return 0;
}

int check_bom(char *t) {
int i;
unsigned int ic;
i=0;
if((t[0]&0xFF)==0xEF && (t[1]&0xFF)==0xBB && (t[2]&0xFF)==0xBF) {
while(i<1000) {
ic=t[i+3]&0xFF;
t[i]=ic;
if(!ic) {i=9999;}
i++;
}
i=1;
}
return i;
}

int utf8_decode(char *s) {
unsigned int i,ic0,ic1,ic2,j,iuc;
char t[100],h[10];
strcpy(t,s);
i=j=0;
s[0]=0;
while(i<100) {
ic0=t[i++]&0xFF;
if(ic0<128) {
// iuc=ic0;
s[j++]=ic0; // 1-Byte ASCII
s[j]=0;
}
else{
if(ic0<192) { // Fehler
s[j++]=(int)"?";
s[j]=0;
}
else{
ic1=t[i++] & 0xFF;
if(ic0<224) { // 2 Byte
iuc=((ic0&31)<<6) | (ic1&63);
sprintf(h,"&#x%X;",iuc);
strcat(s,h);
j=strlen(s);
}
else if(ic0<240) { // 3 Byte
ic2=t[i++] & 0xFF;
iuc=((ic0&15)<<12) | ((ic1&63)<<6) | (ic2&63);
sprintf(h,"&#x%X;",iuc);
strcat(s,h);
j=strlen(s);
}
else{ // Fehler
s[j++]=(int)"?";
s[j]=0;
}
}
}
if(!ic0) {i=9999;}
}
return j-1;
}
Wenn man mit diesem C-Programm die vom oben (Codierung) gezeigten C-Programm hergestellte UTF-8 Text-Datei analysiert, dann erhält man diese Ausgabe:
# BOM #
[line 0]: str[len=3] = AZ
[line 1]: str[len=13] = &#xC4;&#xDC;
[line 2]: str[len=23] = &#x3B1;&#x20AC;&#x3C9;

Sie sind eingeladen, mit den Beispielen zu experimentieren und damit Texte mit beliebigen → Unicode-Zeichen zu codieren und zu decodieren.
Wenn man die decodierten und als XML-Strings neuerlich codierten
Strings in ein XML-Dokument oder in eine HTMl-Webseite einsetzt, dann erhält man das korrekte Ergebnis
# BOM #
[line 0]: str[len=3] = AZ
[line 1]: str[len=13] = ÄÜ
[line 2]: str[len=23] = α€ω

Die als Zwischen-Produkt erzeugte Text-Datei wird mit allen gängigen Text-Editor-Programmen korrekt angezeigt, z.B. (auf Windows) mit Notepad++.

UTF-8 in Dateien

Byte Order Mark

UTF-8 Dateien sollten immer mit dem Kennzeichen (Byte Order Mark, BOM) von 3 Byte Länge beginnen. Viele Anwendungen funktionieren zwar auch ohne BOM, es sollte aber zur Sicherheit immer verwendet werden.
Jede mit diesem BOM beginnende Text-Datei wird von gängigen Programmen aller Betriebssysteme richtig erkannt, d.h. die Zeichen werden nach dem ↑ → UTF-8 Algorithmus decodiert und als → Unicode-Zeichen weiter verarbeitet.

UTF-8 BOM am Beginn einer Datei:
EF BB BF
Nachfolgend: UTF-8 codierter Text ...

HTML-Webseiten:

Jede Webseite kann (und sollte) im UTF-8 Format codiert werden. Die rechts gezeigte <meta>-Anweisung definiert u.a. den Zeichensatz. Das gilt sowohl für statische (mit Editor erzeugte) als auch für dynamische (mit Webserver-Programmen wie → Perl oder → PHP erzeugte) Webseiten.
Die Codierung von Formular-Daten erfolgt mit dem Zeichensatz der HTML-Webseite, man kann sie allenfalls kann mit dem Attribut accept-charset ändern.
Fast alle Seiten dieses Webs verwenden UTF-8.
HTML-Webseite im UTF-8 Format:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
...
<form accept-charset="utf-8">
</form>

XML-Dateien:

UTF-8 ist die Standard-Codierung von → XML-Dateien. Sowohl Daten als auch 'Programme' der gesamten → XML-Familie werden normalerweise UTF-8 codiert. Theoretisch sind auch andere Zeichencodes zulässig.
Fast alle Seiten dieses Webs sind in → XHTML codiert und verwenden die rechts gezeigte XML-Deklaration als 1. Quelltext-Zeile.
XML-Datei:
<?xml version="1.0" encoding="utf-8"?>
Export von UTF-8:
LibreOffice bietet den Menü-Befehl Datei | Speichern unter mit dem Filter 'TextKodiert'. Markieren sie das Kästchen 'Filter bearbeiten': Das folgende Fenster erlaubt die Auswahl zahlreicher Zeichensätze, darunter UTF-8.
Wenn andere Büro-Programme keine Option zum Export von Text im UTF-8 Format anbieten, dann kann man mit Basic (VBA) eine Ersatz-Funktion programmieren n (↑ UTF-8 Codierung).
Ein Geheimtipp ist der 'primitive' Text-Editor notepad.exe, der in jeder Windows-Distribution enthalten ist: Er bietet eine Option zum Speichern des Textes als UTF-8. Man kann aus jedem Windows-Programm Text (inkl. Unicode-Zeichen bis U+FFFF ) in den Editor kopieren und ihn solcherart als UTF-8 Codierer verwenden.

Import von UTF-8:

Der Import funktioniert problemlos:
Alle gängigen Büro-Programme, auch LibreOffice, Word, WordPad und der MS-Editor importieren UTF-8 fehlerfrei, wenn das ↑ BOM vorhanden ist.
Der MS-Editor und Word erkennen UTF-8 auch dann, wenn das BOM fehlt, darauf sollte man sich jedoch nicht verlassen.

UTF-8 in Datenbanken

Mit der rasch fortschreitenden Globalisierung steigt auch der Bedarf, die Texte von Datenbanken global eindeutig lesbar zu machen.
In der IT-Praxis vieler Betriebe ist die Behandlung mehrsprachiger Dokumente leider noch sehr mühsam.
Das ist sogar auf nationaler Ebene notwendig, denn sogar im kleinen Österreich können nicht einmal die Ortsnamen von gemischt-sprachigen Gebieten mit einem einzigen ISO-Zeichensatz dargestellt werden.
Verwenden sie für neue DB-Entwicklungen möglichst nur UTF-8 codierte Tabellen und Felder !
Die Datenbank macht normalerweise keine Probleme:
Jedes Textfeld kann natürlich auch UTF-8 codierte Texte aufnehmen. Das funktioniert mit jeder DB auch sehr alter Versionen. Die Schwierigkeiten liegen bei der Ein- und Ausgabe der Daten, sowie bei DB-spezifischen Arbeiten wie Suchen, Sortieren, usw.

Moderne Datenbanken bieten darüber hinaus Unicode-Funktionen.
Diese SQL-Anweisung zeigt alle verfügbaren MySQL-Zeichensätze:
show character set;
# oder in älteren Versionen
show global variables;
Erzeugung einer MySQL-Tabelle im UTF-8 Format bzw. Änderung einer bereits angelegten Tabelle:
create table `utest` (`pk` int unsigned not null auto_increment,`txt` varchar(20), primary key (`pk`) )character set utf8;
alter table `test` character set utf8;
Im Feld txt wird UTF-8 Code gespeichert, d.h. 1..3 Byte pro Zeichen (U+0000..U+FFFF).
Verwenden sie für Text-Felder immer die Type varchar
Für Felder fixer Länge wie char(20) wird immer die 'worst case'-Länge reserviert, in diesem Falle 60 Byte pro Datensatz !

Alternativ kann eine Tabelle auch im UTF-16 Format angelegt werden, die Option lautet dann character set ucs2
In diesem Falle werden immer 2 Byte pro Zeichen gespeichert.

Tipp: Manche Administrations-Programme kennen die Unicode-Funktionen von MySQL noch nicht. Man muss dann die Befehle direkt als SQL-Code eingeben.
Funktionen CONVERT (src USING chrset) und CAST (src AS CHAR CHARACTER SET chrset) dienen zur Umwandlung von Text von/nach verschiedenen Zeichensätzen. Vorsicht - andere Zeichensätze (z.B. → ISO-8859-1 Latin-1) können die meisten Unicode-Zeichen nicht darstellen !
(Kapitel ↑ Decodierung, Funktion utf8_to_html() ).
select convert(_latin1'Größe' using utf8);
select cast(_latin1'Größe' as char character set utf8);
Diese Funktionen dienen nicht nur der Eingabe und Ausgabe (nur legale Zeichen), sondern werden auch bei fast jeder Suche benötigt !

Eingabe:

Der Import fertig codierter UTF-8 Texte in eine Datenbank ist kein Problem.

Export von UTF-8 aus Programmen, Import in eine DB:
LibreOffice ↑ bietet Optionen zum Export von UTF-7 oder UTF-8.
Leider bieten nicht alle Büro-Programme eine Option zum Export von Texten im UTF-8 Format an.
Ein Geheimtipp ist der 'primitive' Text-Editor, der in jeder Windows-Distribution enthalten ist: Er bietet eine sauber arbeitende Option zum Speichern eines Textes als UTF-8. Man kann aus jedem Win-Programm Texte (inkl. Unicode-Zeichen bis U+FFFF) in den Editor kopieren und ihn solcherart als UTF-8 Codierer verwenden.

Jedes UTF-8 exportierende Programm sollte als Byte-Order Mark (↑ BOM) von UTF-8 die ersten 3 Bytes EF BB BF exportieren. Das ist zwar optional, hilft anderen Programmen jedoch, UTF-8 zu erkennen.

Für die manuelle Eingabe und Pflege von Datenbank-Texten kann jedoch derzeit oft nur ein ISO-Zeichensatz verwendet werden. Die Tastatur lässt sich zwar in jedem gängigen Betriebssystem umschalten, die Software reagiert jedoch nicht immer richtig.

Ideal ist eine Software, welche die manuelle Eingabe bzw. Änderung von Texten in allen Zeichensätzen ermöglicht, wenig Aufwand für die Umschaltung erfordert und dabei sämtliche Zeichen UTF-8 codiert.
Bis zur Verfügbarkeit wirklich brauchbarer Lösungen muss man sich mit eigenen Programmen behelfen, z.B. mit einblendbaren Bildschrimtasten . .

Ausgabe:

Wenn Datenbank-Text exportiert und in anderen gängigen Programmen weiter verarbeitet wird, so ist das kein Problem: Alle gängigen Büro-Programme (LibreOffice, MS-Word, ..) können UTF-8 Texte importieren. Es ist möglich, unverändert exportierte UTF-8 Texte zu verarbeiten, wesentlich sicherer ist es jedoch, das 3-Byte BOM voranzustellen.

Wenn Unicode-Text für Menschen angezeigt werden soll, dann sind dafür Webseiten (HTML) ideal.. Leider bieten die gängigen Programmiersprachen Perl und PHP dazu (noch) wenig Komfort. Im Kapitel ↑ UTF-8 Decodierung finden sie ein (unverbindliches) Muster für eine Funktion utf8_to_html() zur Ausgabe von Unicode-Text auf Webseiten.

Programmierung - UTF-8 in Programmiersprachen

Dokumente:

Manche 'Programmiersprachen' erlauben die Verwendung von Dokumenten, die zur Gänze UTF-codiert sind. Die Bekanntgabe erfolgt unterschiedlich, z.T. mit Attributen in spezieller Syntax, z.T. mit Byte Order Marks (BOMs). Sie sollten sich nur bei Verwendung eigener Dokumente darauf verlassen - Prüfen sie in jedem anderen Fall, welcher Code verwendet wurde. Derzeit verwenden die meisten Dokumente noch → ISO-8859-1 (Latin-1), zunehmend verbreitet sich jedoch UTF-8.
Sie können ihre Webseiten mit dem Logo 'Unicode Encoded' versehen, wenn diese in sauberem HTML bzw. XHTML erstellt und in UTF codiert sind.

HTML

<meta http-equiv="Content-Type" content="text/html;charset=utf-8" >
XHTML:
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
XML:
<?xml version="1.0" encoding="utf-8" ?>

PHP

bietet eine Auswahl verschiedener Möglichkeiten:
Modul xml: (Standard-PHP)
Funktion utf8_encode() übersetzt ISO-8859-1 (Latin-1) → UTF8
Funktion utf8_decode() übersetzt UTF8ISO-8859-1 (Latin-1)
Die beiden Funktionen sind allerdings ebenso wie alle anderen String-Funktionen nur bis U<=FF brauchbar.
Das Modul mbstring (Multibyte String, Standard-PHP, muss zusätzlich geladen werden):
Bietet eine lange Liste von Funktionen, sowohl zur Umwandlung von Codes als auch zur Verarbeitung von Multibyte-Strings.
Modul iconv (seit Version 5 Standard-PHP) kann einige Zeichensätze umwandeln. Verschiedene Optionen für nicht darstellbare Zeichen.
Funktion iconv()
Modul recode: bisher nicht in Standard-PHP enthalten, muss compiliert werden. Kann dafür ca. 150 verschiedene Zeichensätze umwandeln.
Funktion recode_string()
Function strtr() (Standard-PHP) erlaubt die frei programmierbare Umwandlung von Strings.
$iso1 = 'abcäöü';
$utf8 = utf8_encode($iso1);
/*
$tmp = recode_string('latin1..utf8',$s);
$utf8 = iconv('iso-8859-1','utf-8', $tmp);
*/
$iso1 = utf8_decode($utf8);
$utf8 = iconv('ISO-8859-1','UTF-8',$iso1);
$iso2 = iconv('UTF-8','ISO-8859-2',$utf8);

Basic (LibreOffice-Basic, Visual Basic, VBA)

Da es in M$Word leider an Optionen zum Speichern von Text in UTF-8 Code mangelt, hier ein Beispiel als Ersatz (ohne Gewähr):
Zur Verwendung wird der VBA-Code in einem eigenen Modul im Dokument 'Normal' gespeichert, dann steht das Sub für alle Word-Dokumente zur Verfügung. Für häufige Verwendung erstellt man am besten einen eigenen Menü-Punkt im Menü 'Datei'.

Aus dem Dateipfad des (Word)-Dokuments wird ein neuer Pfad-Name td mit der Endung .utf8 erzeugt und in einem Dialogfenster vorgeschlagen.

Wenn eine Antwort tr erfolgt, dann wird eine allfällig vorhandene Datei mit gleichem Namen mit Kill() gelöscht und die neue UTF-8 Datei mit Open geöffnet.
An den Anfang der Datei wird das ↑ BOM EF BB BF geschrieben.

In der for i -Schleife wird jedes Zeichen des gesamten Textes WholeStory einzeln verarbeitet:
Mit Funktion chr_to_utf8() (↑ UTF-8 Codierung) wird das Zeichen in UTF-8 Code umgewandelt, das ergibt Strings von 1..3 Byte Länge.

In der for j - Schleife werden die Bytes des UTF-8 Strings einzeln in die Ausgabe-Datei geschrieben. Wenn die Put()-Funktion einen korrekten String (nur Daten ohne 4-Byte Vorspann, mit Kommentar abgeschaltet) schreiben kann, ist das überflüssig.

Details zum Schreiben von Binär-Dateien in Basic.
Sub save_as_utf8()
Dim i, j, fn As Integer
Dim tp, tt, td, tr As String
Dim utf As String

td = ActiveDocument.FullName
i = InStrRev(td, ".")
td = Left(td, i) & "utf8"

tt = "Text sichern im UTF-8 Code"
tp = "UTF-Dateiname: "
tr = InputBox(tp, tt, td)

If Len(tr) > 0 Then
fn = FreeFile
Kill tr
Open tr For Binary Access Write As #fn
Put #fn, , CByte(&HEF)
Put #fn, , CByte(&HBB)
Put #fn, , CByte(&HBF)
Selection.WholeStory
For i = 1 To Selection.Characters.Count
utf=chr_to_utf8(Selection.Characters.Item(i))
' Put #fn, ,utf
For j = 1 To Len(utf)
Put #fn,,CByte(Asc(Mid(utf,j,1)))
Next
Next
Close #fn
MsgBox "UTF-8 Datei gespeichert."
End If
End Sub
XHTML CSS