Unter den Zeichensätzen, die heutzutage verwendet werden, hat sich vor allem Latin-1 (-2 etc) – eigentlich ISO-8859-1 – und das neue Unicode-Untertyp durchgesetzt. Dennoch existieren viele exotische Zeichensätze, die entweder nur einige Sprachen abdecken (wie KOI8-U für Ukrainsch) oder nur an bestimmten „Orten“ zum Einsatz kommen. Dazu gehören auch die Zeichensätze in den Bibliotheken.Die bekanntesten Vertreter in der MARC- (also der nicht-deutschsprachigen) Welt sind MARC-8 und ANSEL (American National Standard for Extended Latin) sowie das DIN ISO 5426 in MAB2-Daten.

Die Idee dahinter war, den ASCII- so zu erweitern, dass man auch nichtlateinische (oder veränderte lateinische) Zeichen abbilden kann. Die Grundlage für ANSEL stellte die Norm ISO/IEC 6937 dar, die die Zeichen 0x00 bis 0x7f als normale Buchstaben, Zahlen oder Zeichen nutzte, die  Zeichen im Bereich von 0x80 bis 0xff von der „normalen“ Nutzung ausgenommen hat. Alle Zeichen, die nicht ins erste Bereich hineinpassen, werden (ein wenig ähnlich wie in Unicode) aus zwei Bytes zusammengesetzt: Ein nicht-trennender diakritischer Byte (aus zweitem Bereich) begleitet vom Zeichen aus dem Ersten Bereich. 0xCE+0x65 (polnisches ‚ogonek‘-Zeichen + kleines „e“) ergeben zusammen „ę“.

Die Ähnlichkeit mit UTF-8 ist, dass man bestimmte Bereiche von der Nutzung ausnimmt, um sie als einleitende Sequenz für Sonderzeichen einzusetzen. In Ländern wie USA kommt es sehr gut an, da die meisten Buchstaben mit einem Byte (aus dem frei verwendbaren Bereich) abgedeckt werden kann. Die Sonderzeichen brauchen zwar 2 Bytes, doch dies komm nur selten vor. Der Unterschied zu UTF-8 ist, dass es keine Zeichen gibt, die mehr als 2 Byte benötigen.

Der MAB2-Zeichensatz ISO 646 (IRV) zusammen mit ISO 5426 von 1983 benutzen dieselbe Methode. Sie Definieren bestimmte Zeichen als Sequenz-Zeichen wie

  • Sepatatoren: 0x1D = Satzende, 0x1E = Feldende, 0x1f = Unterfeld
  • Nicht-sortier-Zeichen: 0x88 = Anfang, 0x89 = ende
  • Diakritische-Zeichen: 0xC0 bis 0xCF, 0xD0 bis 0xDF (ohne 0xDC)

Andere Zeichen wie 0x20 bis 0x7E sowie 0xA1 bis 0xBF werden wie üblich verwendet: als Buchstaben, Zahlen und Interpunktionszeichen. Einige typographische Besonderheiten wie Ligaturen oder „ß“ und „Ł“ werden in 0xE1, 0xE2, 0xE6, 0xE8, 0xE9, 0xEA, 0xEC, 0xF1, 0xF2, 0xF3, 0xF5, 0xF6, 0xF8, 0xF9, 0xFA, 0xFB, 0xFC (ein Byte) abgebildet.

Kombiniert man 0xC9 mit 0x6f (xc9x6f oder xc96f) bekommt man im MAB2-Zeichensatz das ‚ö‘.

MARC-8 verfährt sehr ähnlich, kennt aber echte Multibyte-Zeichen (für CJK – japanisch). Die folgenden Sequenzzeichen kennt MARC-8:

  • Escape-Zeichen 0x1B in MARC-8 (und in Unicode)
  • Teilfeld-Trenner 0x1F in MARC-8 (und in Unicode)
  • Feld-Ende 0x1E in MARC-8 (und in Unicode)
  • Datensatzende 0x1D in MARC-8 (und in Unicode)
  • Nicht-Sortier-Anfang 0x88 in MARC-8 aber 0x98 in Unicode
  • Nicht-Sortier-Ende, 0x89 in MARC-8 aber 0x9C in Unicode
  • Verbinder 0x8D in MARC-8 aber 0x200D  in Unicode
  • Nicht-Verbinder 0x8E in MARC-8 aber 0x200C  in Unicode
  • Diakritische Sequenzen werden in MARC-8 mit 0xE0 bis 0xEF eingeleitet
  • Die Umschaltung zwischen Zeichensätzen geschieht anhand von Sequenzen, die mit 0x1B beginnen. Darauf folgen 0x67 für griechische Symbole, 0x62 für tiefgestellte, 0x70 für hochgestellte Zeichen… 0x73 für das Ende des besonderen Zeichensatzes.
  • Je nachdem, ob man ISO 2022 -G0 (0x21 bis 0x7E) oder G1 (0xA1 bis 0xFE) verwenden wird, ein oder Mehrbyte Zeichensatz gibt man hinter ESC (0x1B) ein einleitendes Zeichen ein. Ein solches ist für G0 ein  „(“ alternativ „,“ für ein-Byte-, „$“ bzw. „$,“ für Mehrbyte-Zeichen. Bei G1 sind es „)“ alternativ „-“ für ein-Byte-, „$)“ und „$-“ für Mehrbyte-Satz. Erst jetzt wird der Zeichenvorrat angegeben: 1 für den einzigen  mehrbyte-EACC-Zeichensatz für Chinesisch, Japanisch und Koreanisch, 3 für Arabisch, 4 für erweitertes Arabisch, 2 für Hebräisch, S für Griechisch, N für Kyrillisch, Q für erweitertes Kyrillisch, B für ASCII-Lateinische-Zeichen und schlussendlich „!E“ (0x21 0x45) für die Erweiterung des Lateinischen um deutsche, polnische, tschechische und ähnliche Zeichen.

Ansonsten gelten die ersten 7 Bit der ASCII-Tabelle. Einen in MARC-8 kodierten Datensatz erkennt man an einem Leerzeichen an der 9. Stelle des Datensatzkopfes (en. „Leader“). Steht dort ein „a“, wird hingegen Unicode verwendet.

Vor allem die Escape-Sequenzen haben es in sich. Sie erlauben zwar das schnelle Umschalten zwischen Zeichensätzen, sind aber recht kompliziert. Beispiele findet man hier. Die Tabellen mit Sonder- und diakritischen Zeichen einzelner Zeichensätze findet man hier.

Auch wenn UTF-8 mit seinen zwei- und mehrbyte-Sequenzen nicht allzu einfach zu verstehen ist, hat es gegenüber den beiden älteren Vorgängern einen großen Vorteil: Auf eine raffinierte Art und Weise deckt es mit wenig Bits sehr viele Zeichensätze ab. UTF-16 kann zwar noch mehr, doch die Datenmenge verdoppelt sich, wenn man nur Englisch oder Latein verwendet. Die bibliographischen Lösungen sind hingegen recht komplex und zugleich sehr begrenzt, weshalb eine Ablösung (auch der bibliographischen Formate) in der nächsten Zukunft eingeleitet werden sollte.

 

Ps. Hexadezimale (hex) Zeichen schreibe ich wie in PHP gewohnt 0xFF, was xFF in anderen Programmiersprachen oder ÿ im HTML entspricht.

Pss. Ein guter Konverter für MARC-8 wurde in Perl geschrieben. Für MAB2-Zeichensatz existiert ebenfalls einer in Perl aber in 2 Versionen (beide vom Koha-Projekt) alt und neu (in den Quellen unter C4/Charset.pm ab Zeile ca. 900). Eine MAB2-Tabelle gibt es auch.