Jeśli jesteś właścicielem tej strony, możesz wyłączyć reklamę poniżej zmieniając pakiet na PRO lub VIP w panelu naszego hostingu już od 4zł!

Str. główna i mapa serwisu, kodowanie Base64, kodowanie Quoted-Printable, kodowanie UTF-8, kodowanie UTF-16

Opis kodowania UTF-7

Kodowanie UTF-7 jest formą reprezentacji unikodu opracowaną specjalnie z myślą o wyeliminowaniu konieczności stosowania kodowania transportowego, to znaczy przekształcenia treści przesyłki lub jej części z postaci 8-bitowej na 7-bitową. W niektórych sytuacjach stosowanie kodowania 8-bitowego jest (lub było) niedozwolone z powodów technicznych, przede wszystkim była to oryginalna specyfikacja SMTP (wysyłanie e-maili). Obecnie wszystkie protokoły, w tym powszechnie dziś stosowana rozszerzona wersja SMTP nazwana ESMTP, pozwalają na stosowanie kodowania 8-bitowego (niekiedy z drobnymi wyjątkami, np. nagłówki listów i artykułów na grupy dyskusyjne nie mogą zawierać znaków w postaci 8-bitowej).

Kodowanie to pozostawia przeważającą ilość znaków US-ASCII (wielkie i małe litery łacińskie, cyfry, znaki przestankowe, nawiasy…) oraz znaki sterujące (nowa linia, tabulator) bez zmian. Znaki należące do US-ASCII: odwrotny ukośnik (\) i tylda (~) oraz wszystkie pozostałe znaki (lub ciągi wymienionych znaków) są zamieniane na odpowiednie kody UTF-7 z wykorzystaniem mechanizmu bardzo podobnego do użytego w kodowaniu transportowym Base64 – ciągi 16-bitowych numerów kodowanych znaków zamieniane są na grupy sześciobitowe, a następnie wyrażane z użyciem 64 specjalnie przyporządkowanych znaków ze zbioru US-ASCII (każdy będzie wysłany jako 8 bitów z najbardziej znaczącym bitem równym zero). Specjalnego traktowania wymaga plus (+), w pewnych wypadkach może wymagać również dywiz (-). Treść zakodowana UTF-7 może być częściowo czytelna dla człowieka, gdy kodowany jest tekst języka używającego alfabetu łacińskiego.

UTF-7 może być przesłany z dowolną deklaracją Content-Transfer-Encoding, w tym 7-bit. Mimo swoich zalet (daje znacznie krótszy kod wynikowy od UTF-8 + Quoted­-Printable, w przypadku języków opartych o alfabet łaciński jest bardziej czytelny niż UTF-8 + Base64) nie jest zalecany do użycia w poczcie ani w usenecie. Używany jest do pewnych zadań w protokole MAPI. Wadą jest fakt, że każdy znak może być zakodowany na dużą ilość sposobów (w zależności od miejsca i sąsiednich znaków w kodowanym ciągu), co stwarzałoby ogromne problemy z budową narzędzi do przeszukiwania baz danych używających tego kodowania.

grupaznak grupaznak grupaznak grupaznak
000000 A 010000 Q 100000 g 110000 w
000001 B 010001 R 100001 h 110001 x
000010 C 010010 S 100010 i 110010 y
000011 D 010011 T 100011 j 110011 z
000100 E 010100 U 100100 k 110100 0
000101 F 010101 V 100101 l 110101 1
000110 G 010110 W 100110 m 110110 2
000111 H 010111 X 100111 n 110111 3
001000 I 011000 Y 101000 o 111000 4
001001 J 011001 Z 101001 p 111001 5
001010 K 011010 a 101010 q 111010 6
001011 L 011011 b 101011 r 111011 7
001100 M 011100 c 101100 s 111100 8
001101 N 011101 d 101101 t 111101 9
001110 O 011110 e 101110 u 111110 +
001111 P 011111 f 101111 v 111111 /

Należy pamiętać, że po pierwsze liczy się wielkość liter, a po drugie kodowi 001110 jest przyporządkowana wielka litera O, a kodowi 110100 cyfra zero, nie można ich mylić.

Kodowanie

Za przykład posłuży nam ciąg słów „żółw As”.

  1. Każdy znak ciągu do zakodowania przedstawiamy w postaci binarnej UTF-16, w naszym przypadku kodować będziemy tylko ciąg „żół” (dla ułatwienia pokazany będzie pośredni etap przedstawienia w postaci szesnastkowej):
    00BF 00F3 00B3 → 0000000010111111 0000000010110011 0000000001110111
  2. Grupujemy zapis binarny w grupy po sześć bitów, zaczynając od lewej strony:
    0000000010111111 0000000010110011 0000000001110111 → 000000 001011 111100 000000 101100 110000 000001 110111
  3. W przypadku, gdy ostatnia grupa zawiera mniej niż sześć bitów, dopisujemy na końcu taką liczbę zer, by grupa zawierała sześć bitów. W naszym przykładzie nie ma takiej potrzeby.
  4. W tabeli kodów znajdujemy odpowiedniki kolejnych grup sześciobitowych i zapisujemy je:
    000000 001011 111100 000000 101100 110000 000001 110111 → AL8AsB3
  5. Przed zakodowany ciąg wstawiamy +, za zakodowany ciąg wstawiamy - (w pewnych sytuacjach dywiz na końcu nie jest konieczny), a następnie wstawiamy otrzymany kod w resztę ciągu:
    AL8AsB3 → +AL8AsB3-w As

Ponieważ znak + zawsze oznacza początek ciągu UTF-7, plus w tekście oznacza się jako +-.

Gdy ciąg UTF-7 ma być umieszczony w nagłówku, należy go dodatkowo zakodować (tylko po to, by przenieść informację o kodowaniu), najdogodniejsza metoda to użycie kodowania Quoted­-Printable (w którym sam kod się nie zmienia), w naszym wypadku przykładowy ciąg w nagłówku będzie wyglądał następująco:
=?utf-7?Q?+AL8AsB3-w_As?=

Dekodowanie

Dekodowanie jest procesem odwrotnym do kodowania. Za przykład posłuży nam ciąg +AL8AsB3-w As.

  1. Wybieramy wszystkie zakodowane ciągi, odrzucamy początkowe plusy i ewentualne końcowe dywizy (końcem kodowanego ciągu może też być spacja, koniec linii i generalnie każdy znak inny niż wymieniony w tabeli powyżej):
    +AL8AsB3-w As → AL8AsB3
  2. W tabeli kodów znajdujemy odpowiedniki kolejnych znaków i zapisujemy je:
    AL8AsB3 → 000000 001011 111100 000000 101100 110000 000001 110111
  3. Grupujemy zapis binarny w grupy po 16 bitów, zaczynając od lewej:
    000000 001011 111100 000000 101100 110000 000001 110111 → 0000000010111111 0000000010110011 0000000001110111
  4. Ostatnia grupa może mieć mniej niż szesnaście bitów, wówczas powinna składać się z samych zer (jeżeli tak nie jest, to znaczy, że ciąg nie został prawidłowo zakodowany lub został ucięty w czasie transmisji), należy ją usunąć. W naszym przykładzie nie ma takiej potrzeby
  5. Każdy binarna liczba dwubajtowa (grupa szesnastu bitów) oznacza numer znaku w unikodzie. Można je przekształcić do dogodniejszego zapisu (dziesiętny, szesnastkowy), po czym zastępuje się każdą dwubajtową liczbę znakiem z danej pozycji unikodu:
    0000000010111111 0000000010110011 0000000001110111 → 00BF 00F3 00B3 → żół
    a następnie wstawia się w resztę ciągu:
    żółw As

Przyrost objętości

Pojedynczy znak w UTF-7 kodowany jest z użyciem pięciu (czasem czterech) bajtów. W bardzo długich ciągach stosunek ilości bajtów do ilości znaków dąży do 83. Liczby te dotyczą tylko znaków z BMP (Basic Multilingual Plane). Sumaryczny przyrost objętości w porównaniu z kodowaniem 8-bitowym zależy od treści i procentowej zawartości znaków podlegających kodowaniu, przykładowy plik polski po konwersji z ISO-8859-2 na UTF-7 powiększył swoją objętość o ok. 17%.

licznik