Etwas, das mich lange verwirrt hat, ist, dass so viel Software die Begriffe "Zeichensatz" und "Codierung" als Synonyme verwendet.
Wenn Menschen auf eine Unicode- "Codierung" verweisen, meinen sie immer einen Regelsatz zur Darstellung von Unicode-Zeichen als Folge von Bytes - wie ASCII oder UTF-8. Dies scheint vernünftig und intuitiv zu sein; Die Idee ist, dass Sie diese Zeichen unter Verwendung des angegebenen Regelsatzes als Bytes "codieren".
Da diese Regelsätze manchmal nur die Möglichkeit bieten, eine Teilmenge aller Unicode-Zeichen zu "codieren", können Sie sich vorstellen, dass ein "Zeichensatz" - kurz für "Zeichensatz" - einfach einen Satz von Unicode-Zeichen bedeutet - ohne Rücksicht darauf, wie Diese Zeichen sind codiert. Eine Codierung würde somit einen Zeichensatz implizieren (eine Codierung wie ASCII, die nur Regeln zum Codieren von 128 Zeichen enthält, würde dem Zeichensatz dieser 128 Zeichen zugeordnet sein), aber ein Zeichensatz muss keine Codierung implizieren (zum Beispiel UTF-8, UTF -16 und UTF-32 sind alle unterschiedliche Codierungen, können jedoch denselben Zeichensatz codieren.
Doch - und hier ist der Kern meiner Frage - die reale Verwendung des Wortes "Zeichensatz" entspricht nicht dem, was die Konstruktion des Wortes implizieren würde. Es wird fast immer verwendet, um "Codierung" zu bedeuten.
Zum Beispiel:
- Das
charset
Attribut in HTML wird verwendet, um eine Codierung anzugeben Charset
s in Java sind Codierungencharset
s undcharacter sets
in MySQL sind wieder Codierungen
Wie alt ist dieser merkwürdige (ab) Sprachgebrauch und wie kam es zu dieser kontraintuitiven Definition von "Zeichensatz"? Ist es vielleicht aus einer Zeit stammen , als es wirklich war , in der Praxis eine Eins-zu-Eins - Abbildung zwischen Codierungen im Einsatz und Zeichensätze unterstützt sie? Oder gab es einen besonders einflussreichen Standard oder eine Spezifikation, die diese Definition des Wortes diktierten?
quelle
charset
älter als der Unicode-Standard. Obwohl es sich möglicherweise nicht um eine "Eins-zu-Eins-Zuordnung" handelt, erzwingen die für ein Dokument erforderlichen Zeichen tendenziell die Wahl der Codierung. Aber ich habe keine Zeit, die tatsächliche Geschichte des Wortes zu erforschen ...Antworten:
Das Konzept der Zeichensätze ist älter als Unicode.
Vor Unicode definierte ein Zeichensatz einen Zeichensatz und wie jedes Zeichen als Bits dargestellt wurde. Die meisten Zeichensätze ordneten ein Zeichen einem Byte zu (was einen Satz von 256 Zeichen erlaubte), einige zwei Bytes und einige (wie ASCII) nur 7 Bits. Unterschiedliche Zeichensätze haben demselben Zeichen häufig unterschiedliche Werte zugewiesen, und es gab keinen universellen Übersetzungsschlüssel zwischen den verschiedenen verwendeten Zeichensätzen.
Unicode war ein Versuch, dieses Problem zu lösen, indem alle verschiedenen Zeichensätze in einer gemeinsamen "Obermenge" zusammengefasst wurden. Zu diesem Zweck führte Unicode einige zusätzliche Abstraktionsebenen ein, beispielsweise das Konzept der Zeichencodierung als etwas, das von den Codepunktwerten getrennt ist. Dies erlaubt Unicode zu definieren , die Pre-Unicode - Zeichensätze als Unicode - Zeichenkodierungen.
Das Zeichensatzattribut in HTML (das beispielsweise den Zeichensatzparameter im Header des HTTP-Inhaltstyps widerspiegelt) stammt aus der Zeit vor der weit verbreiteten Einführung von Unicode. Als jedoch entschieden wurde, Unicode als universellen Zeichensatz des Internets zu akzeptieren, wurde das Zeichensatzattribut verwendet wurde nur neu definiert, um die verwendete Codierung anzugeben , aber der Name wurde nicht geändert, um Abwärtskompatibilität zu ermöglichen.
quelle
Der Begriff "Zeichensatz" ist natürlich die Abkürzung für "Zeichensatz", was wiederum ein alter Begriff ist, der für eine Zeichenkodierung verwendet wird, die interpretiert werden kann als a) eine Zuordnung zwischen Folgen von Bytes und Zeichen, b) eine Zuordnung zwischen Ganzzahlen (Codenummern) und Zeichen oder c) eine Zuordnung zwischen abstrakten Zeichen und entweder Ganzzahlen oder Folgen von Bytes.
"Zeichensatz" wurde verwendet, da es sich um einen kurzen und einfachen Ausdruck handelt. Darin hat „Set“ eine vage Bedeutung (da das gesamte Konzept vage ist), wurde aber später oft als Sammlung („Set“ im satztheoretischen Sinne) falsch interpretiert, wie in Dan Connellys (einst) berühmtem Zeichensatz beschrieben Als schädlich angesehen .
Am wichtigsten war dann, dass der Bezeichner
charset
in MIME und in HTTP verwendet wurde. Der HTTP 1.0- Alias RFC 1945 zitiert die MIME-Definition „eine Methode, die mit einer oder mehreren Tabellen verwendet wird, um eine Folge von Oktetten in eine Folge von Zeichen umzuwandeln“ und kommentiert dann die Verwirrung: „Diese Verwendung des Begriffs„ Zeichensatz “ist mehr üblicherweise als "Zeichenkodierung" bezeichnet. Da HTTP und MIME dieselbe Registrierung verwenden, ist es wichtig, dass auch die Terminologie gemeinsam genutzt wird. “quelle
RFC2045 führte "Zeichensatz" in MIME ein und zu diesem Zeitpunkt war bereits klar, dass nicht alle Codierungen ein Zeichen einem Oktett zugeordnet haben. RFC2130 behandelt diese Geschichte etwas ausführlicher.
Grundsätzlich war "Zeichensatz" ein beliebterer Begriff, als diese Standards geschrieben wurden. Er ist prägnanter als "Zeichenkodierung" oder "Textcodierungsschema" und weniger mehrdeutig als "Codierung".
quelle
Für die Übertragung von Text gelten mindestens 2 Codierungen. Die Zeichenkodierung beschreibt, wie Zeichen (Glyphen) codiert werden. Alle Sprachen verwenden eine Teilmenge des UCS-Zeichensatzes, die häufig mit einem 8-Bit-Wert codiert sind. Standardisierte Zeichensätze haben Standardzeichenkodierungen, und die Begriffe werden im Allgemeinen synonym verwendet.
Die Übertragungscodierung beschreibt, wie der Text übertragen wird, und ist im Allgemeinen unabhängig von der Zeichencodierung. Die meisten Übertragungscodierungen sind nicht transparent und ändern die übertragene Bytesequenz. Die 8-Bit-Übertragungscodierung ist für 8-Bit-Codierungen transparent. Die 7-Bit-Übertragungscodierung kann nur 7-Bit-Zeichensätze wie ASCII übertragen
ASCII verwendet 95 druckbare Zeichen und einige weitere Zeichen für die Wagensteuerung (Zeilenvorschub, Formularvorschub, Wagenrücklauf, Rücktaste und Tabulatoren), die in 7 Bit codiert sind. Es gibt zusätzliche Steuerzeichen, die die verbleibenden Werte verwenden. ASCII ist eine geeignete Teilmenge der UCS-Zeichensätze sowie vieler 8-Bit-Zeichensätze. ISO-8859-1 ist ebenfalls eine geeignete Teilmenge des UCS-Zeichensatzes, aber diese Zeichen haben in UTF-8 eine unterschiedliche Codierung, bei der mehrere Bytes für Zeichenwerte größer als 127 verwendet werden.
IBM Mainframes verwenden (d) die EBCDID, die eine andere 8-Bit-Codierung verwendet. Es gibt Übersetzungstabellen, die die druckbaren Zeichen zwischen ASCII- und ECBDIC-Zeichencodierungen zuordnen. ECBDIC hat einen größeren Zeichensatz als ASCII, da Interpunktionszeichen in ASCII nicht verfügbar sind. Dies kann eine vollständige Roundtrip-Transformation zwischen diesen beiden Codierungen verhindern, wenn die anfängliche Codierung ECBDIC ist.
Diese Codierung war für Sprachen mit Zeichen, die nicht durch die druckbaren ASCII-Zeichen abgedeckt sind, nicht ausreichend. Microsoft und andere verwendeten 8-Bit-Erweiterungen für den ASCII-Zeichensatz und codierten zusätzliche Zeichen mit Werten über 127. Eine einzelne Erweiterung war nicht für alle Sprachen ausreichend, da diese Erweiterungen dem Zeichensatz nur bis zu 96 Zeichen hinzufügten. Dies führte dazu, dass mehrere Zeichensätze (Zeichensätze) für verschiedene Sprachen mit unterschiedlicher 8-Bit-Zeichenkodierung verwendet wurden. Diese Zeichensätze enthalten die für diese Sprache oder Sprachfamilie erforderlichen Zeichen. Die zusätzlichen Zeichen können in verschiedenen Zeichensätzen mit unterschiedlichen Werten codiert werden. Englische Benutzer bemerken dies am wahrscheinlichsten durch erweiterte Interpunktion (linke und rechte Anführungszeichen und Bindestriche), die falsch angezeigt werden, wenn der falsche Zeichensatz verwendet wird.
Bei Einzelbyte-Codierungen können nur Zeichen im Zeichensatz codiert werden. Einige Sprachen erforderten Mehrbyte-Codierungen, um ihren Zeichensatz abzudecken. Der Unicode-Zeichensatz (UCS) erfordert Mehrbyte-Codierungen für Zeichen außerhalb des ASCII-Zeichensatzes. Dieser Zeichensatz ist eine Obermenge aller sprachspezifischen Codierungen. UTF-8 ist eine kompakte Codierung des UCS-Zeichensatzes. ASCII erfordert keine zusätzlichen Bytes, und die meisten (alle?) Zeichen in europäischer Sprache können als ein oder zwei Bytes codiert werden. Der vollständige UCS-2-Zeichensatz kann in ein bis drei Bytes codiert werden. Alle Zeichen im aktuellen UCS-Zeichensatz können in ein bis vier Bytes codiert werden.
quelle
FWIW, IIRC, Zurück im Commodore 64 Tage war ein Zeichensatz eine Funktion von {0, ... 255} bis zum Satz aller uxv-Schwarzweißbilder, bei denen u und v vielleicht 8 und 12 waren Zeichensatz "bedeutet die Verwendung des Befehls POKE in der Sprache BASIC, um die Speicherorte zu ändern, die für diese Bilder vorgesehen sind. Zum Beispiel bedeutete der ASCII-Code 65 A, und das Bild eines A würde ab der Speicheradresse a * 65 + b für einige b gespeichert, und ich denke a = u * v.
quelle