Binarna uporządkowana kompresja dla Unicode

Binary Ordered Compression for Unicode ( BOCU ) to schemat kompresji Unicode zgodny z MIME . BOCU-1 łączy szerokie zastosowanie UTF-8 ze zwartością standardowego schematu kompresji dla Unicode (SCSU). To kodowanie Unicode jest przeznaczone do kompresji krótkich ciągów i zachowuje kolejność punktów kodowych. BOCU-1 jest określony w nocie technicznej Unicode.

Dla porównania SCSU przyjęto jako standardowy schemat kompresji Unicode ze stosunkiem bajtów do punktów kodowych podobnym do stron kodowych specyficznych dla języka . SCSU nie został powszechnie przyjęty, ponieważ nie nadaje się do „tekstowych” typów mediów MIME. Na przykład SCSU nie można używać bezpośrednio w wiadomościach e-mail i podobnych protokołach. SCSU wymaga skomplikowanej konstrukcji enkodera dla dobrej wydajności. Zazwyczaj algorytmy zip , bzip2 i inne standardowe algorytmy branżowe skuteczniej kompaktują większe ilości tekstu Unicode.

Zarówno SCSU, jak i BOCU-1 są zestawami znaków zarejestrowanymi przez IANA .

Detale

Wszystkie liczby w tej sekcji są szesnastkowe , a wszystkie zakresy są włącznie.

Punkty kodowe od U+0000 do U+0020 są kodowane w BOCU-1 jako odpowiednia wartość bajtu. Wszystkie inne punkty kodowe (tj. U+0021 do U+D7FF i U+E000 do U+10FFFF ) są kodowane jako różnica między punktem kodowym a znormalizowaną wersją ostatnio zakodowanego punktu kodowego, który nie był spacją ASCII ( U+0020 ). Stan początkowy to U+0040 . Mapowanie normalizacji wygląda następująco:

Zakres kodu Znormalizowany punkt kodowy Notatki
U+3040 do U+309F U+3070 Hiragana
U+4E00 do U+9FA5 U+7711 Unihan
U+AC00 do U+D7A3 U+C1D1 Hangul
U+0020 stan enkodera zachowany bez zmian Przestrzeń

U+ hhhh 00 do U+ hhhh 7F (z wyłączeniem zakresów powyżej)
U+hhhh40
środek 128

U+ hhhh 80 do U+ hhhh FF (z wyłączeniem zakresów powyżej)
U+ hhhh C0
środek 128

Różnica między bieżącym punktem kodowym a znormalizowanym poprzednim punktem kodowym jest kodowana w następujący sposób:

Zakres różnicy
Zakres sekwencji bajtów (patrz poniżej)
-10FF9F do -2DD0D 21 F0 58 D9 do 21 FF FF FF
-2DD0C do -2912 22 01 01 do 24 FF FF
-2911 do -41 25 01 do 4F FF
-40 do 3F 50 do CF
40 do 2910 D0 01 do FA FF
2911 do 2DD0B FB 01 01 do FD FF FF
2DD0C do 10FFBF FE 01 01 01 do FE 19 B4 54

Każdy zakres bajtów jest uporządkowany leksykograficznie z wykluczeniem następujących trzynastu bajtów: 00 07 08 09 0A 0B 0C 0D 0E 0F 1A 1B 20 . Na przykład, po sekwencji bajtów FC 06 FF , kodującej różnicę 1156B , następuje bezpośrednio po sekwencji bajtów FC 10 01 , kodującej różnicę 1156C .

Każde wejście ASCII od U+0000 do U+007F z wyłączeniem spacji U+0020 resetuje koder do U+0040 . Ponieważ powyższe wartości obejmują punkty kodowe końca linii U+000D i U+000A w obecnej postaci ( 0D 0A ), koder jest w znanym stanie na początku każdej linii. Uszkodzenie pojedynczego bajtu wpływa zatem co najwyżej na jedną linię. Dla porównania, uszkodzenie pojedynczego bajtu w UTF-8 dotyczy co najwyżej jednego punktu kodowego, w przypadku SCSU może dotyczyć całego dokumentu.

BOCU-1 oferuje podobną solidność również dla tekstów wejściowych bez wyżej wymienionych wartości ze specjalnym kodem resetowania 0xFF . Kiedy dekoder znajdzie ten oktet, resetuje swój stan do U+0040 jak dla końca linii. Użycie 0xFF nie jest zalecane w specyfikacji BOCU-1, ponieważ jest to sprzeczne z innymi celami projektowymi BOCU-1, zwłaszcza z porządkiem binarnym .

Opcjonalne użycie podpisu U+FEFF na początku tekstów zakodowanych w BOCU-1, tj. sekwencji bajtów BOCU-1 FB EE 28 , zmienia stan początkowy U+0040 na U+FEC0 . Innymi słowy, podpisu nie można po prostu usunąć, jak w większości innych schematów kodowania Unicode. Dodanie bajtu resetowania po podpisie ( FB EE 28 FF ) mogłoby uniknąć tego efektu, ale specyfikacja BOCU-1 nie zaleca tej praktyki.

Teoretycznie UTF-1 i UTF-8 mogą kodować oryginalny zestaw UCS-4 z 31 bitami do 7FFFFFFF . BOCU-1 i UTF-16 mogą kodować nowoczesny zestaw Unicode od U+0000 do U+10FFFF . trzynaście chronionych punktów -1 może używać oktetów w wielobajtowym BOCU-1 potrzebuje co najwyżej czterech bajtów składających się z bajtu wiodącego i jednego do trzech bajtów końcowych. Bajty śladu kodują pozostałą różnicę „ moduł 243” (podstawa 243), bajt wiodący określa liczbę bajtów śladu i początkową różnicę. Należy zauważyć, że bajt resetowania 0xFF nie jest chroniony i może występować jako bajt końcowy.

Patent

Przed 16 listopada 2022 r. ogólny algorytm BOCU był objęty patentem Stanów Zjednoczonych nr 6 737 994, w którym wspomniano również o konkretnej implementacji BOCU-1. Ten patent już wygasł.

IBM , który zatrudniał obu wynalazców BOCU-1 w momencie jego tworzenia, stwierdził w nocie technicznej Unicode, że osoby wdrażające „w pełni zgodną wersję BOCU-1” musiały skontaktować się z IBM w celu uzyskania bezpłatnej licencji. BOCU-1 to jedyny schemat kompresji Unicode opisany w witrynie internetowej Unicode, o którym wiadomo, że jest obciążony ograniczeniami dotyczącymi własności intelektualnej .

Z kolei IBM złożył również wniosek o patent na UTF-EBCDIC , ale w tym przypadku zdecydował się udostępnić dokumentację i schemat kodowania „nieodpłatnie każdemu zainteresowanemu uczynieniem formatu transformacji jako części standardów UCS”, zamiast wymagać od wdrożeniowców poprosić o licencję.

Zobacz też