Unterschiede im Unicode-, UTF-, ASCII- und ANSI-Format


351

Was ist der Unterschied zwischen den Unicode, UTF8, UTF7, UTF16, UTF32, ASCII, und ANSICodierungen?

Inwiefern sind diese für Programmierer hilfreich?


Die beste Seite zu verweisen wäre: msdn.microsoft.com/en-us/library/dd374081(VS.85).aspx
RamSri



Antworten:


470

Gehen Sie Ihre Liste durch:

  • " Unicode " ist keine Codierung, obwohl leider in vielen Dokumentationen ungenau verwendet wird, um auf die Unicode-Codierung zu verweisen, die das jeweilige System standardmäßig verwendet. Unter Windows und Java bedeutet dies häufig UTF-16. an vielen anderen Orten bedeutet es UTF-8. Richtig, Unicode bezieht sich auf den abstrakten Zeichensatz selbst, nicht auf eine bestimmte Codierung.
  • UTF-16 : 2 Bytes pro "Codeeinheit". Dies ist das native Format von Zeichenfolgen in .NET und im Allgemeinen in Windows und Java. Werte außerhalb der Basic Multilingual Plane (BMP) werden als Ersatzpaare codiert. Diese verwendet werden relativ selten verwendet, aber jetzt viele Consumer - Anwendungen müssen sich bewusst sein Nicht-BMP - Zeichen , um Unterstützung Emojis.
  • UTF-8 : Codierung mit variabler Länge, 1-4 Bytes pro Codepunkt. ASCII-Werte werden mit 1 Byte als ASCII-Werte codiert.
  • UTF-7 : Wird normalerweise für die E-Mail-Codierung verwendet. Wenn Sie glauben, dass Sie es brauchen und keine Post schreiben, liegen Sie wahrscheinlich falsch. (Das ist nur meine Erfahrung mit Leuten, die in Newsgroups usw. posten - außerhalb von E-Mails wird es wirklich überhaupt nicht häufig verwendet.)
  • UTF-32 : Feste Breitencodierung mit 4 Bytes pro Codepunkt. Dies ist nicht sehr effizient, erleichtert aber das Leben außerhalb des BMP. Ich habe eine .NET- Utf32StringKlasse als Teil meiner MiscUtil- Bibliothek, falls Sie dies jemals möchten. (Es wurde nicht sehr gründlich getestet, wohlgemerkt.)
  • ASCII : Einzelbyte-Codierung nur unter Verwendung der unteren 7 Bits. (Unicode-Code zeigt 0-127.) Keine Akzente usw.
  • ANSI: Es gibt keine feste ANSI-Codierung - es gibt viele davon. Wenn Leute "ANSI" sagen, meinen sie normalerweise "das Standardgebietsschema / die Standardcodepage für mein System", das über erhalten wird Encoding.Default wird und häufig Windows-1252 ist, aber auch andere Gebietsschemas sein kann.

Es gibt noch mehr meiner Unicode-Seite finden Sie Informationen und Tipps zum Debuggen von Unicode-Problemen .

Die andere große Ressource von Code ist unicode.org , die mehr Informationen enthält , als Sie jemals in der Lage sein werden Ihren Weg durch arbeiten - vielleicht das nützlichste Bit ist die Code - Chart .


6
Der Begriff "ANSI", wenn er auf die 8-Bit-Codepages von Microsoft angewendet wird, ist eine falsche Bezeichnung. Sie basierten auf Entwürfen, die zur ANSI-Standardisierung eingereicht wurden, aber ANSI selbst hat sie nie standardisiert. Windows-1252 (die Codepage, die am häufigsten als "ANSI" bezeichnet wird) ähnelt ISO 8859-1 (Latin-1), außer dass Windows-1252 druckbare Zeichen im Bereich 0x80..0x9F enthält, wobei ISO 8859-1 hat Steuerzeichen in diesem Bereich. Unicode hat auch Steuerzeichen in diesem Bereich. en.wikipedia.org/wiki/Windows_code_page
Keith Thompson

1
@ jp2code: Ich würde nicht - aber Sie müssen zwischen "Inhalten, die über HTTP vom Webserver zurückgesendet werden" und "Inhalten, die per E-Mail gesendet werden" unterscheiden. Es ist nicht der Webseiteninhalt, der die E-Mail sendet - es ist vermutlich die App dahinter. Der Webinhalt ist am besten in UTF-8; Der E-Mail-Inhalt könnte in UTF-7 sein, obwohl ich vermute, dass es in Ordnung ist, dies heutzutage in UTF-8 zu behalten.
Jon Skeet

2
Für UTF-16, IMHO, würde ich "2 Bytes pro Codeeinheit" sagen, da ein Codepunkt außerhalb des BMP in Ersatzpaaren als 2 Codeeinheiten (4 Bytes) codiert wird.
Ludovic Kuty

1
Fehlt die Unterschiede zwischen UTF-16LE (innerhalb von .NET) und BE sowie der Begriff der Stückliste.
Maarten Bodewes

2
@ Andrew: Nein, es gibt keinen (allgemeinen) Codierungsmarker. Windows 1252 kann die Unicode-Stückliste nicht darstellen, und es wäre nicht sinnvoll, da es sich ohnehin nur um eine Codierung mit einem Byte pro Zeichen handelt.
Jon Skeet

68

Lesen Sie etwas, um Ihnen den Einstieg in die Zeichenkodierung zu erleichtern: Joel über Software: Das absolute Minimum, das jeder Softwareentwickler unbedingt über Unicode und Zeichensätze wissen muss (keine Ausreden!)

Übrigens - ASP.NET hat nichts damit zu tun. Kodierungen sind universell.


7
Beantwortet hier 6 Jahre nachdem der Artikel geschrieben wurde. Ich habe es 8 Jahre nach dem Schreiben des Beitrags gelesen. 14 Jahre später und es ist immer noch eine gute Lektüre. Das ist mehr als die Hälfte meines Lebens her. Unglaublich.
Dave Knise
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.