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ł! Do you want to support owner of this site? Click here and donate to his account some amount, he will be able to use it to pay for any of our services, including removing this ad.

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