Was ist der Unterschied zwischen Codierung und Zeichensatz?


151

Ich bin verwirrt über die Textcodierung und den Zeichensatz. Aus vielen Gründen muss ich in meiner bevorstehenden Arbeit Nicht-Unicode- und Nicht-UTF8-Inhalte lernen.

Ich finde das Wort "Zeichensatz" in E-Mail-Headern wie in "ISO-2022-JP", aber es gibt keine solche Codierung in Texteditoren. (Ich habe mich in den verschiedenen Texteditoren umgesehen.)

Was ist der Unterschied zwischen Textcodierung und Zeichensatz? Ich würde mich freuen, wenn Sie mir einige Anwendungsbeispiele zeigen könnten.


Antworten:


144

Grundsätzlich:

  1. Zeichensatz ist der Zeichensatz, den Sie verwenden können
  2. Codierung ist die Art und Weise, wie diese Zeichen im Speicher gespeichert werden

42
Richtig, aber im tatsächlichen Gebrauch bezieht sich "Zeichensatz" normalerweise sowohl auf das Zeichenrepertoire als auch auf das Codierungsschema.
Alan Moore

@AlanMoore In der Tat, so wie die Leute "Dezimalzahl" sagen, um sich auf eine beliebige Zahl mit einem "Dezimaltrennzeichen" zu beziehen. Es ist nicht wirklich richtig, aber ja, Sie sollten sich bewusst sein, dass einige Leute es so benutzen.
Bvdb

2
Das ist nicht genau richtig. Beispielsweise bezieht sich Unicode auf den Zeichensatz, es gibt jedoch mehrere mögliche Codierungen (UTF-8, UTF-16, UTF-32).
rghome

84

Jeder Codierung ist ein bestimmter Zeichensatz zugeordnet, es kann jedoch mehr als eine Codierung für einen bestimmten Zeichensatz geben. Ein Zeichensatz ist einfach das, wonach er sich anhört, eine Reihe von Zeichen. Es gibt eine große Anzahl von Zeichensätzen, darunter viele, die für bestimmte Skripte oder Sprachen vorgesehen sind.

Wir sind jedoch auf dem besten Weg zum Übergang zu Unicode, das einen Zeichensatz enthält, der fast alle Skripte der Welt darstellen kann. Es gibt jedoch mehrere Codierungen für Unicode. Eine Codierung ist eine Möglichkeit, eine Zeichenfolge einer Zeichenfolge von Bytes zuzuordnen. Beispiele für Unicode-Codierungen umfassen UTF-8 , UTF-16 BE und UTF-16 LE . Jedes davon hat Vorteile für bestimmte Anwendungen oder Maschinenarchitekturen.


20
Beachten Sie, dass Javadoc fälschlicherweise "Zeichensatz" anstelle von "Codierung" verwendet. In InputStreamReader lesen wir beispielsweise "Ein InputStreamReader ist eine Brücke von Bytestreams zu Zeichenströmen: Er liest Bytes und decodiert sie mit einem angegebenen Zeichensatz in Zeichen. Der Zeichensatz, der Die Verwendung kann namentlich angegeben oder explizit angegeben werden, oder der Standardzeichensatz der Plattform kann akzeptiert werden. " . Was sie jedoch bedeuten, ist "Codierung".
David Tonhofer

4
Vielen Dank für Ihre Erklärung. Unicode ist ein Zeichensatz, und UTF-8 ist eine Codierungsmethode von Unicode , und UTF-16 ist eine andere Codierungsmethode von Unicode .
HongchaoZhang

47

Zusätzlich zu den anderen Antworten denke ich, dass dieser Artikel eine gute Lektüre ist http://www.joelonsoftware.com/articles/Unicode.html

Der Artikel trägt den Titel " Das absolute Minimum, das jeder Softwareentwickler unbedingt über Unicode und Zeichensätze wissen muss (keine Ausreden!) ", Geschrieben von Joel Spolsky . Der Aufsatz ist mehr als 10 Jahre alt, aber (leider) ist der Inhalt noch gültig ...


2
Vielen Dank für die Einführung des Artikels. Es ist gut.
TK.

9
Diese Antwort könnte verbessert werden, indem kurz erklärt wird, warum ich Joels Artikel lesen sollte.
James.garriss

@mattanja Der Link, den Sie bereitgestellt haben, ist wirklich großartig. Danke für das Teilen. Abgestimmt.
Hagrawal

1
Ich möchte auch diesen großartigen Artikel veröffentlichen, der ein bisschen Anhang zu Joel Spolskys ist. kunststube.net/encoding
mkb

Ich habe Joels Artikel bei meiner ersten Lektüre nicht verstanden. Vielmehr fand ich diesen Powerpoint viel klarer und spezifischer: unicode.org/notes/tn23/Muller-Slides+Narr.pdf
johnsimer

27

Eine Zeichenkodierung besteht aus:

  1. Der Satz unterstützter Zeichen
  2. Eine Zuordnung zwischen Zeichen und ganzen Zahlen ("Codepunkte")
  3. Wie Codepunkte als eine Reihe von "Codeeinheiten" codiert werden (z. B. 16-Bit-Einheiten für UTF-16)
  4. Wie Codeeinheiten in Bytes codiert werden (z. B. Big-Endian oder Little-Endian)

Schritt 1 an sich ist ein "Zeichenrepertoire" oder ein abstrakter "Zeichensatz", und # 1 + # 2 = ein "codierter Zeichensatz".

Doch bevor Unicode populär wurde und alle (außer Ostasiaten) eine Einzelbyte-Codierung verwendeten, waren die Schritte 3 und 4 trivial (Codepunkt = Codeeinheit = Byte). Daher unterschieden ältere Protokolle nicht klar zwischen "Zeichenkodierung" und "codiertem Zeichensatz". Ältere Protokolle werden verwendet, charsetwenn sie wirklich Codierung bedeuten.


Wäre es der Grund, warum wir charset = 'utf-8' im HTML-META-Tag lesen können? weil es vor langer Zeit definiert wurde
Eildosa

26

Es wäre hoffentlich hilfreich, mehr Licht für die Besucher zu werfen.


Zeichensatz

In jeder Sprache gibt es Zeichen, und die Sammlung dieser Zeichen bildet den „Zeichensatz“ dieser Sprache. Wenn ein Zeichen codiert ist, wird ihm eine eindeutige Kennung oder eine Nummer zugewiesen, die als Codepunkt bezeichnet wird. Im Computer werden diese Codepunkte durch ein oder mehrere Bytes dargestellt.

Beispiele für Zeichensätze: ASCII (deckt alle englischen Zeichen ab), ISO / IEC 646, Unicode (deckt Zeichen aus allen lebenden Sprachen der Welt ab)

Codierter Zeichensatz

Ein codierter Zeichensatz ist ein Satz, in dem jedem Zeichen eine eindeutige Nummer zugewiesen wird. Diese eindeutige Nummer wird als "Codepunkt" bezeichnet.
Codierte Zeichensätze werden manchmal als Codepages bezeichnet.

Codierung

Die Codierung ist der Mechanismus zum Zuordnen der Codepunkte mit einigen Bytes, sodass ein Zeichen unter Verwendung desselben Codierungsschemas über verschiedene Systeme hinweg einheitlich gelesen und geschrieben werden kann.

Beispiele für die Codierung: ASCII-, Unicode-Codierungsschemata wie UTF-8, UTF-16, UTF-32.

Ausarbeitung der oben genannten 3 Konzepte

  • Betrachten wir das - Zeichen ‚क‘ in Devanaga Zeichensatz einen dezimalen hat Codepunkt von 2325, der durch zwei Bytes dargestellt werden ( 09 15) , wenn die Verwendung von UTF-16 - Codierung
  • Im Codierungsschema „ISO-8859-1“ wird „ü“ (dies ist nichts anderes als ein Zeichen im lateinischen Zeichensatz) als Hexadezimalwert dargestellt, FCwährend es in „UTF-8“ als C3 BCund in UTF-16 als dargestellt wird FE FF 00 FC.
  • Unterschiedliche Codierungsschemata können denselben Codepunkt verwenden, um unterschiedliche Zeichen darzustellen. Beispielsweise ist in „ISO-8859-1“ (auch als Latin1 bezeichnet) der Dezimalcodepunktwert für den Buchstaben 'é' 233. In ISO 8859-5 beträgt der Wert jedoch Der gleiche Codepunkt repräsentiert das kyrillische Zeichen 'щ'.
  • Andererseits kann ein einzelner Codepunkt im Unicode-Zeichensatz tatsächlich verschiedenen Byte-Sequenzen zugeordnet werden, je nachdem, welche Codierung für das Dokument verwendet wurde. Das Devanagari-Zeichen क mit dem Codepunkt 2325 (915 in hexadezimaler Schreibweise) wird bei Verwendung der UTF-16-Codierung ( 09 15) durch zwei Bytes , mit UTF-8 ( E0 A4 95) durch drei Bytes oder mit UTF-32 durch vier Bytes dargestellt ( 00 00 09 15)

11

Ein Zeichensatz oder ein Zeichenrepertoire ist einfach ein Satz (eine ungeordnete Sammlung) von Zeichen. Ein codierter Zeichensatz weist jedem Zeichen im Repertoire eine Ganzzahl (einen "Codepunkt") zu. Eine Codierung ist eine Möglichkeit, Codepunkte eindeutig als Bytestrom darzustellen.


Dies sollte die akzeptierte Antwort sein. Es werden drei Konzepte klar definiert: Zeichensatz, codierter Zeichensatz und Codierung.
Marcus Junius Brutus

6

Googelte danach. http://en.wikipedia.org/wiki/Character_encoding

Der Unterschied scheint subtil zu sein. Der Begriff Zeichensatz gilt eigentlich nicht für Unicode. Unicode durchläuft eine Reihe von Abstraktionen. abstrakte Zeichen -> Codepunkte -> Codierung von Codepunkten in Bytes.

Zeichensätze überspringen dies tatsächlich und springen direkt von Zeichen zu Bytes. Folge von Bytes <-> Folge von Zeichen

Kurz gesagt, Codierung: Codepunkte -> Bytes Zeichensatz: Zeichen -> Bytes


5

Ein Zeichensatz ist nur ein Satz; es enthält entweder das Euro-Zeichen oder nicht. Das ist alles.

Eine Codierung ist eine bijektive Zuordnung von einem Zeichensatz zu einem Satz von Ganzzahlen. Wenn es das Euro-Zeichen unterstützt, muss es diesem Zeichen und keinem anderen eine bestimmte Ganzzahl zuweisen.


Muss es bijektiv sein?
Jörg W Mittag

2
Nun, Codierung und Decodierung sollten deterministisch sein, daher kann es wirklich keine mehrdeutigen Zuordnungen geben. Ich nehme an, Sie könnten einen nicht zusammenhängenden Satz von Ganzzahlen als Codomäne haben, aber das würde Speicherplatz verschwenden, wenn Sie Text speichern, und Ingenieure hassen verschwendeten Speicherplatz.
Kilian Foth

1
Legacy-Zeichenkodierungen sind oft nicht bijektiv. In IBM437 werden beispielsweise sowohl ß als auch β durch 0xE1 dargestellt.
Dan04

3

Meiner Meinung nach ist ein Zeichensatz Teil einer Codierung (einer Komponente). Die Codierung hat ein Zeichensatzattribut, sodass ein Zeichensatz in vielen Codierungen verwendet werden kann. Zum Beispiel ist Unicode ein Zeichensatz, der in Codierungen wie UTF-8, UTF-16 usw. verwendet wird. Siehe Abbildung hier:Siehe Abbildung hier

Das Zeichen in Zeichensatz bedeutet nicht den Zeichentyp in der Programmierwelt, es bedeutet ein Zeichen in der realen Welt, in Englisch ist es vielleicht dasselbe, aber in anderen Sprachen ist '我' kein untrennbares 'Zeichen' in Zeichensätzen (UNICODE, GB [verwendet in GBK und GB2312]), 'a' ist auch ein Zeichen in Zeichensätzen (ASCII, ISO-8859 , UNICODE).


1

Meiner Meinung nach sollte sich das Wort "Zeichensatz" darauf beschränken, den in HTTP, MIME und ähnlichen Standards verwendeten Parameter zu identifizieren, um eine Zeichenkodierung (eine Zuordnung von einer Reihe von Textzeichen zu einer Folge von Bytes) nach Namen anzugeben. Zum Beispiel : charset=utf-8.

Mir ist jedoch bewusst, dass MySQL, Java und andere Orte das Wort "Zeichensatz" verwenden können, um eine Zeichenkodierung zu bedeuten.


1

Eine Codierung ist eine Zuordnung zwischen Bytes und Zeichen aus einem Zeichensatz. Daher ist es hilfreich, den Unterschied zwischen Bytes und Zeichen zu diskutieren und zu verstehen .

Stellen Sie sich Bytes als Zahlen zwischen 0 und 255 vor, während Zeichen abstrakte Dinge wie "a", "1", "$" und "Ä" sind. Der Satz aller verfügbaren Zeichen wird als Zeichensatz bezeichnet .

Jedes Zeichen hat eine Folge von einem oder mehreren Bytes, die zur Darstellung verwendet werden. Die genaue Anzahl und der genaue Wert der Bytes hängen jedoch von der verwendeten Codierung ab , und es gibt viele verschiedene Codierungen.

Die meisten Codierungen basieren auf einem alten Zeichensatz und einer Codierung namens ASCII, die ein einzelnes Byte pro Zeichen (tatsächlich nur 7 Bit) ist und 128 Zeichen enthält, einschließlich vieler der im US-Englisch verwendeten allgemeinen Zeichen.

Hier sind beispielsweise 6 Zeichen im ASCII-Zeichensatz, die durch die Werte 60 bis 65 dargestellt werden.

Extract of ASCII Table 60-65
╔══════╦══════════════╗
║ Byte ║  Character   ║
╠══════╬══════════════║
║  60  ║      <       ║
║  61  ║      =       ║
║  62  ║      >       ║
║  63  ║      ?       ║
║  64  ║      @       ║
║  65  ║      A       ║
╚══════╩══════════════╝

Im vollständigen ASCII-Satz ist der niedrigste verwendete Wert Null und der höchste 127 (beide sind versteckte Steuerzeichen).

Sobald Sie jedoch mehr Zeichen benötigen, als das grundlegende ASCII bereitstellt (z. B. Buchstaben mit Akzenten, Währungssymbolen, Grafiksymbolen usw.), ist ASCII nicht mehr geeignet und Sie benötigen etwas umfangreicheres. Sie benötigen mehr Zeichen (einen anderen Zeichensatz) und eine andere Codierung, da 128 Zeichen nicht ausreichen, um alle Zeichen aufzunehmen. Einige Codierungen bieten ein Byte (256 Zeichen) oder bis zu sechs Bytes.

Im Laufe der Zeit wurden viele Codierungen erstellt. In der Windows-Welt gibt es CP1252 oder ISO-8859-1, während Linux-Benutzer UTF-8 bevorzugen. Java verwendet UTF-16 nativ.

Eine Folge von Bytewerten für ein Zeichen in einer Codierung kann für ein völlig anderes Zeichen in einer anderen Codierung stehen oder sogar ungültig sein.

In ISO 8859-1 wird â beispielsweise durch ein Byte Wert dargestellt 226, während es in UTF-8 zwei Bytes sind : 195, 162. Doch in ISO 8859-1 , 195, 162würden zwei Zeichen lang sein, Ã, ¢ .

Wenn Computer Daten über Zeichen intern speichern oder an ein anderes System übertragen, speichern oder senden sie Bytes. Stellen Sie sich vor, ein System, das eine Datei öffnet oder eine Nachricht empfängt, sieht die Bytes 195, 162. Woher weiß es, welche Charaktere das sind?

Damit das System diese Bytes als tatsächliche Zeichen interpretieren (und sie so anzeigen oder in eine andere Codierung konvertieren kann), muss es die verwendete Codierung kennen. Aus diesem Grund wird die Codierung in XML-Headern angezeigt oder kann in einem Texteditor angegeben werden. Es teilt dem System die Zuordnung zwischen Bytes und Zeichen mit.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.