UTF-7

UTF-7
Sprachen) International
Standard RFC 2152
Einstufung Unicode -Transformationsformat, ASCII -Rüstung, Codierung der variablen Breite, Staatliche Kodierung
Transformationen / codiert ISO/IEC 10646 (Unicode)
Vorausgegangen von Hz-GB-2312
gefolgt von UTF-8 Über 8bitmime

UTF-7 (7-bisschen Unicode -Transformationsformat) ist eine veraltete Zeichenkodierung variabler Länge zur Darstellung Unicode Text mit einem Stream von ASCII Figuren. Es sollte ursprünglich ein Codierungsmittel darstellen Unicode Text zur Verwendung in Internet Email Nachrichten, die effizienter waren als die Kombination von UTF-8 mit zitiert.

UTF-7 (nach seinem RFC) ist kein "Unicode -Transformationsformat", da die Definition nur Codepunkte in der Bmp (Die ersten 65536 Unicode -Codepunkte, die nicht enthalten Emojis und viele andere Charaktere). Wenn jedoch ein UTF-7-Übersetzer von/von ist UTF-16 Dann kann (und tut es wahrscheinlich) jede Ersatzhälfte so, als wäre es ein 16-Bit-Codepunkt und kann somit alle Codepunkte codieren. Es ist unklar, ob andere UTF-7-Software (wie Übersetzer zu UTF-32 oder UTF-8) dies unterstützen.

UTF-7 war noch nie ein offizieller Standard der Unicode -Konsortium. Es ist bekannt, dass es Sicherheitsprobleme hat, weshalb Software geändert wurde, um ihre Verwendung zu deaktivieren.[1] es ist verboten in HTML 5.[2][3]

Motivation

MIME, der moderne Standard des E-Mail-Formats, verbietet die Kodierung von Header Verwenden von Byte -Werten über dem ASCII -Bereich. Obwohl MIME ermöglicht, den Nachrichtenkörper in verschiedenen Kodierung zu codieren Zeichensätze (breiter als ASCII), die zugrunde liegende Übertragungsinfrastruktur (SMTPDer Haupt-E-Mail-Übertragungsstandard) ist immer noch nicht garantiert 8-Bit sauber. Daher muss im Zweifelsfall eine nicht triviale Inhalttransferkodierung angewendet werden. Leider Basis64 hat einen Nachteil, wenn er sogar macht US-Ascii Charaktere, die in Nicht-Mime-Clients nicht lesbar sind. Andererseits UTF-8 kombiniert mit zitiert erzeugt ein sehr großes Format, das 6–9 Bytes für Nicht-ASCII-Zeichen aus dem erfordert Bmp und 12 Bytes für Zeichen außerhalb des BMP.

Vorausgesetzt, bestimmte Regeln werden während der Codierung befolgt, kann UTF-7 in E-Mail ohne zugrunde liegende Mime gesendet werden Übertragungscodierung, muss aber noch explizit als Textzeichen identifiziert werden. Außerdem muss UTF-7, wenn sie innerhalb von E-Mail-Headern wie "Subjekt:" verwendet werden, in MIME enthalten sein codierte Wörter Identifizieren des Zeichensatzes. Da codierte Wörter die Verwendung von beiden erzwingen zitiert oder Basis64, UTF-7 wurde entwickelt, um zu vermeiden, dass das = Zeichen als Escape-Zeichen verwendet wird, um zu vermeiden, dass es doppelt entkommt, wenn es mit zitiertem Druck (oder seiner Variante, der RFC 2047/1522?

UTF-7 wird im Allgemeinen nicht als native Darstellung innerhalb von Anwendungen verwendet, da sie sehr umständlich ist. Trotz seines Größenvorteils gegenüber der Kombination von UTF-8 mit zitiertem oder base64, der inzwischen verstorben Internet -Mail -Konsortium Empfohlen gegen seine Verwendung.[4]

8bitmime wurde ebenfalls eingeführt, was die Notwendigkeit reduziert, Nachrichtenkörper in einem 7-Bit-Format zu kodieren.

Eine modifizierte Form von UTF-7 (manchmal als 'MUTF-7' bezeichnet) wird derzeit in der verwendet IMAP E-Mail-Abrufprotokoll für Mailboxnamen.[5]

Beschreibung

UTF-7 wurde erstmals als experimentelles Protokoll in RFC 1642 vorgeschlagen. Ein Mail-safe-Transformationsformat von Unicode. Dies RFC wurde von RFC 2152 veraltet, einem Informations -RFC, der nie zu einem Standard wurde. Wie RFC 2152 eindeutig feststellt, "gibt der RFC" keine Internetstandards jeglicher Art fest ". Trotzdem wird RFC 2152 als Definition von UTF-7 in der IANA-Liste der Charsets zitiert. UTF-7 ist auch nicht ein Unicode-Standard. Der Unicode Standard 5.0 Listet nur UTF-8, UTF-16 und UTF-32 auf. Es gibt auch eine modifizierte Version, die in RFC 2060 angegeben ist und manchmal als UTF-7 identifiziert wird.

Einige Zeichen können direkt als einzelne ASCII -Bytes dargestellt werden. Die erste Gruppe ist als "Direktzeichen" bekannt und enthält 62 alphanumerische Zeichen und 9 Symbole: '(), -. /:?. Die direkten Charaktere können buchstäblich sicher einschließen. Die andere Hauptgruppe, die als "optionale Direktzeichen" bezeichnet wird, enthält alle anderen druckbaren Zeichen im Bereich U+0020–U+007E außer ~ \ + und Raum (die Charaktere \ und ~ ausgeschlossen werden, weil sie in "Varianten von ASCII" neu definiert wurden, z. Jis-roman). Die Verwendung der optionalen Direktfiguren reduziert die Größe und verbessert die Lesbarkeit der Menschen, erhöht jedoch auch die Wahrscheinlichkeit eines Bruchs durch Dinge wie schlecht gestaltete Mail -Gateways und erfordert möglicherweise zusätzliche Flucht, wenn sie in codierten Wörtern für Headerfelder verwendet werden.

Raum, Tab, Wagenrückgabe und Linienfutter können auch direkt als einzelne ASCII -Bytes dargestellt werden. Wenn der codierte Text jedoch in der E-Mail verwendet werden soll, ist Vorsicht erforderlich, um sicherzustellen, dass diese Zeichen auf eine Weise verwendet werden, für die keine weitere Inhalttransfercodierung erforderlich ist, um für E-Mails geeignet zu sein. Das Pluszeichen (+) kann codiert werden wie +-.

Andere Zeichen müssen in UTF-16 codiert werden (daher würde U+10000 und höher in zwei Ersatzkörper codiert) und dann in dann in modifiziertes Basis64. Der Beginn dieser Blöcke von modifiziertem Basis64-codierten UTF-16 wird durch a angezeigt + Schild. Das Ende wird durch ein Zeichen angezeigt, das nicht im modifizierten Basis64 -Satz ist. Wenn das Zeichen nach der modifizierten Base64 a ist - (ASCII Bindestrich-Minus) dann wird es vom Decoder und von Decoding -Lebensläufen mit dem nächsten Charakter konsumiert. Andernfalls wird das Dekodieren mit dem Charakter nach der Base64 fortgesetzt.

Beispiele

  • "Hallo Welt!"ist codiert als"Hallo Welt+Ace-"
  • "1 + 1 = 2"ist codiert als"1 +- 1 +ad0- 2"
  • "£ 1"ist codiert als"+AKM-1". Der Unicode -Codepunkt für die Pfund-Zeichen ist u+00A3, das sich in konvertiert in modifiziertes Basis64 wie in der Tabelle unten. Es sind zwei Bits übrig, die auf 0 gepolstert sind.
Sechskantig 0 0 EIN 3  
Bitmuster 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 1 0 0
Index 0 10 12
Base64-codiert EIN K M

Algorithmus zur Codierung und Dekodierung

Codierung

Erstens muss ein Encoder entscheiden, welche Zeichen direkt in ASCII -Form darstellen, welche + muss als entkommen als +-, und welche in Blöcken von Unicode -Zeichen platzieren. Die Expansionskosten von UTF-7 können hoch sein: Beispielsweise beträgt die Zeichensequenz U+10ffff u+0077 u+10ffff 9 Bytes in UTF-8, aber 17 Bytes in UTF-7. (Im schlimmsten Fall erzeugt die Behandlung jeder CodePoint als eigene Sequenz die maximale Expansion von 5x, z. B. bei der Codierung @@ wie +Aea-+aea-.) Jede Unicode -Sequenz muss unter Verwendung des folgenden Verfahrens codiert und dann von den entsprechenden Graben umgeben werden.

Verwenden Sie die Zeichensequenz £ † (U+00A3 U+2020) als Beispiel:

  1. Drücken Sie die Unicode-Zahlen des Charakters (UTF-16) in Binärdatei aus:
    • 0x00a3 → 0000 0000 1010 0011
    • 0x2020 → 0010 0000 0010 0000
  2. Verkettet die binären Sequenzen:
    0000 0000 1010 0011 und 0010 0000 0010 0000 → 0000 0000 1010 0011 0010 0000 0010 0000
  3. Gruppieren Sie die Binärdehnung in Gruppen von sechs Bits, beginnend von links:
    0000 0000 1010 0011 0010 0000 0010 0000 → 000000 001010 001100 100000 001000 00
  4. Wenn die letzte Gruppe weniger als sechs Teile hat, fügen Sie nachverfolgunge Nullen hinzu:
    000000 001010 001100 100000 001000 00 → 000000 001010 001100 100000 001000 000000
  5. Ersetzen Sie jede Gruppe von sechs Bits durch einen jeweiligen Basis64 -Code:
    000000 001010 001100 100000 001000 000000 → AKMGIA

Dekodierung

Zunächst muss eine codierten Daten in einfache ASCII -Textbrocken unterteilt werden (einschließlich +ES gefolgt von einem Armaturenbrett) und nicht leeren Unicode -Blöcken, wie im Abschnitt Beschreibung erwähnt. Sobald dies erledigt ist, muss jeder Unicode -Block mit der folgenden Prozedur dekodiert werden (unter Verwendung des Ergebniss des obigen Codierungsbeispiels als unser Beispiel).

  1. Drücken Sie jeden Basis64 -Code als Bitsequenz aus, die er darstellt:
    AKMGIA → 000000 001010 001100 100000 001000 000000
  2. Gruppieren Sie die Binärdehnung in Gruppen von 16 Bits, beginnend von links:
    000000 001010 001100 100000 001000 000000 → 0000000010100011 0010000000100000 0000
  3. Wenn sich am Ende eine unvollständige Gruppe befindet, die nur Nullen enthält, verwerfen Sie sie (wenn die unvollständige Gruppe irgendwelche enthält, ist der Code ungültig):
    0000000010100011 0010000000100000
  4. Jede Gruppe von 16 Bits ist die UTF-16-Nummer (UTF-16) eines Charakters und kann in anderen Formen ausgedrückt werden:
    0000 0000 1010 0011 ≡ 0x00a3 ≡ 16310

Byte -Bestellmarke

Eine Byte Order Mark (BOM) ist eine optionale spezielle Byte -Sequenz zu Beginn eines Streams oder einer Datei, die ohne Daten selbst die für die folgende Daten verwendete Codierung anzeigt. Es kann in Abwesenheit von Metadaten verwendet werden, die die Codierung bezeichnen. Für ein bestimmtes Codierungsschema ist es die Darstellung des Unicode -Codepunkts durch das Schema U+feff.[6]

Während es sich in der Regel um eine einzelne, feste Byte-Sequenz handelt, können in UTF-7 vier Variationen auftreten, da die letzten 2 Bit des 4. Byte der UTF-7-Codierung von U+feff Gehören zur folgen Charakter, was zu 4 möglichen Bitmustern und damit 4 verschiedene mögliche Bytes in der 4. Position führt. Siehe den UTF-7-Eintrag in der Tabelle der Unicode -Byte -Bestellungsmarken.[7]

Sicherheit

UTF-7 ermöglicht mehrere Darstellungen derselben Quellzeichenfolge. Insbesondere können ASCII -Zeichen als Teil von Unicode -Blöcken dargestellt werden. Wenn Standard-Flucht- oder Validierungsprozesse für ASCII-basierte ASCII-basierte Strings verwendet werden, die später als UTF-7 interpretiert werden können, können Unicode-Blöcke verwendet werden, um böswillige Zeichenfolgen an ihnen vorbei zu schieben. Um dieses Problem zu mildern, sollten Systeme vor der Validierung eine Decodierung durchführen und vermeiden, UTF-7 zu autodieren.

Ältere Versionen von Internet Explorer kann dazu gebracht werden, die Seite als UTF-7 zu interpretieren. Dies kann für a verwendet werden Cross-Site-Scripting Angriff als die < und > Markierungen können codiert werden als +Adw- und +Ad4- In UTF-7, die die meisten Validatoren als einfachen Text durchlassen.[8]

UTF-7 gilt zumindest für Microsoft Software (.NET) als veraltet, wobei Codepfade bisher absichtlich unterbrochen werden (um Sicherheitsprobleme zu verhindern) in .NET 5, 2020.[1]

Verweise

  1. ^ a b "Breaking Change: UTF-7-Codepfade sind veraltet". docs.microsoft.com. Abgerufen 8. Januar 2021.
  2. ^ "8.2.2.3. Charaktercodierungen". HTML 5.1 Standard. W3c.
  3. ^ "12.2.3.3 Charaktercodierungen". HTML Living Standard. Waswg.
  4. ^ "Verwenden internationaler Charaktere in Internet Mail". Internet -Mail -Konsortium. 1. August 1998. archiviert von das Original am 7. September 2015.
  5. ^ RFC 3501 Abschnitt 5.1.3
  6. ^ "FAQ-UTF-8, UTF-16, UTF-32 & BOM".
  7. ^ https://unicode.org/l2/l2021/21038-bom-guidance.pdf[Bare URL PDF]
  8. ^ "Artikelutf7 - docType -Mirror - UTF -7: Der Fall des fehlenden Charset - Spiegel von Google DocType - Google Project Hosting". 14. Oktober 2011. Abgerufen 29. Juni 2012.

Siehe auch