Proszę o policzenie wszystkich możliwych prawidłowych kombinacji w Unicode z wyjaśnieniem.
1 111 998 : 17 płaszczyzn × 65 536 znaków na płaszczyznę - 2048 surogatów - 66 nie-znaków
Zauważ, że UTF-8 i UTF-32 teoretycznie mogą zakodować znacznie więcej niż 17 płaszczyzn, ale zasięg jest ograniczony ze względu na ograniczenia kodowania UTF-16 .
137 929 punktów kodowych jest faktycznie przypisanych w Unicode 12.1 .
Nie rozumiem też, dlaczego bajty kontynuacji mają ograniczenia, mimo że początkowy bajt tego znaku określa, jak długo powinien być.
Celem tego ograniczenia w UTF-8 jest uczynienie kodowania samosynchronizującymi .
Dla kontrprzykładu rozważmy chińskie kodowanie GB 18030 . Tam litera ß
jest reprezentowana jako sekwencja bajtów 81 30 89 38
, która zawiera kodowanie cyfr 0
i 8
. Więc jeśli masz funkcję wyszukiwania ciągów znaków, która nie została zaprojektowana dla tego specyficznego dla kodowania dziwactwa, to wyszukiwanie cyfry 8
znajdzie fałszywie dodatni wynik w literze ß
.
W UTF-8 nie może się to zdarzyć, ponieważ brak nakładania się między bajtami wiodącymi i bajtami śladu gwarantuje, że kodowanie krótszego znaku nigdy nie może nastąpić w ramach kodowania dłuższego znaku.
Unicode pozwala na 17 płaszczyzn , każdy z 65 536 możliwych znaków (lub „punktów kodowych”). Daje to łącznie 1114 112 możliwych znaków. Obecnie tylko około 10% tej powierzchni zostało przydzielone.
Dokładne szczegóły kodowania tych punktów kodowych różnią się w zależności od kodowania, ale twoje pytanie sprawia, że brzmi to tak, jakbyś myślał o UTF-8. Przyczyną ograniczeń dotyczących bajtów kontynuacji jest przypuszczalnie, że łatwo jest znaleźć początek następnego znaku (ponieważ znaki kontynuacji mają zawsze postać 10xxxxxx, ale bajt początkowy nigdy nie może mieć tej postaci).
źródło
Unicode obsługuje 1114 112 punktów kodowych. Istnieje 2048 zastępczych punktów kodowych, co daje 1112 064 wartości skalarne. Spośród nich jest 66 nie-znaków, co prowadzi do 1111 998 możliwych zakodowanych znaków (chyba że popełniłem błąd w obliczeniach).
źródło
Dać przenośni dokładną odpowiedź
all of them
.Bajty kontynuacyjne w kodowaniu UTF-8 pozwalają na ponowną synchronizację zakodowanego strumienia oktetów w obliczu „szumu liniowego”. Koder, wystarczy przeszukać bajt, który nie ma wartości między 0x80 i 0xBF, aby wiedzieć, że następny bajt jest początkiem nowego punktu znaku.
Teoretycznie stosowane obecnie kodowania pozwalają na wyrażanie znaków, których liczba znaków Unicode ma długość do 31 bitów. W praktyce to kodowanie jest faktycznie wdrażane w usługach takich jak Twitter, gdzie tweet o maksymalnej długości może zakodować dane o wartości do 4340 bitów. (140 znaków [prawidłowe i nieprawidłowe], razy po 31 bitów).
źródło
perl -le 'print ord "\x{1FFF_FFFF_FFFF}"'
wypisuje 35184372088831 na maszynie 64-bitowej, ale daje przepełnienie całkowitoliczbowe na maszynie 32-bitowej. Można użyć większych znaków takich jak Perl, że wewnątrz programu, ale jeśli spróbujesz wydrukować je jako utf8, masz obowiązek ostrzeżenia, chyba że wyłączenie takie:perl -le 'print "\x{1FFF_FFFF}"' Code point 0x1FFFFFFF is not Unicode, may not be portable at -e line 1. ######
. Istnieje różnica między „luźnym utf8” a „ścisłym UTF-8”: to pierwsze nie jest ograniczone.len(chr(0x10000))
, podając 2 (jednostki kodu). Jądro OS X używa UTF-8, poprawne - ale API wysokiego poziomu (Cocoa itp.) Używają UTF-16.[𝒜-𝒵]
, a zobaczysz, dlaczego ujawnianie UTF-16 jest nieudolnym. Błędem jest zmuszanie programistów do myślenia w formach kodowania zamiast w logicznych znakach.Unicode ma liczbę szesnastkową 110000, czyli 1114112
źródło
Według Wikipedii Unicode 12.1 (wydany w maju 2019 r.) Zawiera 137994 różnych znaków.
źródło