Jeśli UTF-8 ma 8 bitów, czy nie oznacza to, że może istnieć tylko maksymalnie 256 różnych znaków?
Pierwsze 128 punktów kodowych jest takich samych jak w ASCII. Ale mówi, że UTF-8 może obsługiwać do miliona znaków?
Jak to działa?
Jeśli UTF-8 ma 8 bitów, czy nie oznacza to, że może istnieć tylko maksymalnie 256 różnych znaków?
Pierwsze 128 punktów kodowych jest takich samych jak w ASCII. Ale mówi, że UTF-8 może obsługiwać do miliona znaków?
Jak to działa?
Odpowiedzi:
UTF-8 nie używa przez cały czas jednego bajtu, ma od 1 do 4 bajtów.
źródło: Wikipedia
źródło
UTF-8 wykorzystuje od 1 do 4 bajtów na znak: jeden bajt na znaki ascii (pierwsze 128 wartości Unicode jest takich samych jak ascii). Ale to wymaga tylko 7 bitów. Jeśli ustawiony jest najwyższy („znak”) bit, oznacza to początek sekwencji wielobajtowej; liczba kolejnych starszych bitów wskazuje liczbę bajtów, następnie 0, a pozostałe bity składają się na wartość. W przypadku pozostałych bajtów najwyższe dwa bity będą miały wartość 1 i 0, a pozostałe 6 bitów będzie stanowić wartość.
Zatem czterobajtowa sekwencja zaczynałaby się od 11110 ... (i ... = trzy bity dla wartości), a następnie trzy bajty po 6 bitów na wartość, dając 21-bitową wartość. 2 ^ 21 przekracza liczbę znaków Unicode, więc cały Unicode można wyrazić w UTF8.
źródło
Zgodnie z tą tabelą * UTF-8 powinien obsługiwać:
2 31 = 2 147 483 648 znaków
Jednak RFC 3629 ograniczył możliwe wartości, więc teraz jesteśmy ograniczone do 4 bajtów , co daje nam
2 21 = 2097152 znaków
Zwróć uwagę, że spora część tych znaków jest „zarezerwowana” do użytku niestandardowego, co jest całkiem przydatne w przypadku czcionek z ikonami.
* Użyta Wikipedia pokazuje tabelę z 6 bajtami - od tego czasu zaktualizowali artykuł.
źródło
0xxxxxxx
daje 7 użytecznych bitów,110xxxxx 10xxxxxx
daje 11 więcej - nie ma nakładania się. Pierwszy bajt zaczyna się0
w pierwszym przypadku, aw1
drugim przypadku.00000001
przechowuje, a co11000000 100000001
przechowuje?Unicode vs UTF-8
Unicode zamienia punkty kodowe na znaki. UTF-8 to mechanizm przechowywania danych dla Unicode. Unicode ma specyfikację. UTF-8 ma specyfikację. Obaj mają różne ograniczenia. UTF-8 ma inne ograniczenie w górę.
Unicode
Unicode jest oznaczony jako „płaszczyzny”. Każdy samolot przenosi 2 16 punktów kodowych. W Unicode jest 17 samolotów. Suma
17 * 2^16
punktów kodowych. Pierwszy samolot, samolot 0 lub BMP , jest szczególny w stosunku do masy, co niesie.Zamiast wyjaśniać wszystkie niuanse, zacytuję tylko powyższy artykuł o samolotach.
UTF-8
Wróćmy teraz do powyższego artykułu,
Widzisz więc, że możesz umieścić w UTF-8 rzeczy, które nie są poprawnym Unicode. Czemu? Ponieważ UTF-8 obsługuje punkty kodowe, których Unicode nawet nie obsługuje.
UTF-8, nawet z ograniczeniem do czterech bajtów, obsługuje 2 21 punktów kodowych, czyli znacznie więcej niż
17 * 2^16
źródło
2.164.864 „znaków” może być potencjalnie zakodowanych przez UTF-8.
Ta liczba to 2 ^ 7 + 2 ^ 11 + 2 ^ 16 + 2 ^ 21, co wynika ze sposobu działania kodowania:
0xxxxxxx
Znaki 1-bajtowe mają 7 bitów do kodowania (0x00-0x7F)2-bajtowe znaki mają 11 bitów do kodowania
110xxxxx 10xxxxxx
(0xC0-0xDF dla pierwszego bajtu; 0x80-0xBF dla drugiego)1110xxxx 10xxxxxx 10xxxxxx
Znaki 3-bajtowe mają 16 bitów do kodowania (0xE0-0xEF dla pierwszego bajtu; 0x80-0xBF dla bajtów kontynuacji)11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
Znaki 4-bajtowe mają 21 bitów do kodowania (0xF0-0xF7 dla pierwszego bajtu; 0x80-0xBF dla bajtów kontynuacji)Jak widać, jest to znacznie więcej niż obecny Unicode (1112 064 znaków).
AKTUALIZACJA
Moje wstępne obliczenia są błędne, ponieważ nie uwzględniają dodatkowych reguł. Więcej szczegółów można znaleźć w komentarzach do tej odpowiedzi.
źródło
UTF-8 to kodowanie o zmiennej długości z minimum 8 bitami na znak.
Znaki z wyższymi punktami kodowymi zajmują do 32 bitów.
źródło
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
, więc tylko 21 bitów może być użyte do zakodowania rzeczywistego znaku.Cytat z Wikipedii: „UTF-8 koduje każdy z 1 112 064 punktów kodowych w zestawie znaków Unicode przy użyciu jednego do czterech 8-bitowych bajtów (określanych jako„ oktety ”w standardzie Unicode)”.
Niektóre linki:
źródło
Sprawdź standard Unicode i powiązane informacje, takie jak wpis w często zadawanych pytaniach, UTF-8, UTF-16, UTF-32 i BOM . To nie jest takie płynne żeglowanie, ale to wiarygodne informacje, a wiele z tego, co można przeczytać o UTF-8 gdzie indziej, jest wątpliwe.
„8” w „UTF-8” odnosi się do długości jednostek kodu w bitach. Jednostki kodu to jednostki używane do kodowania znaków, niekoniecznie jako proste mapowanie jeden do jednego. UTF-8 używa zmiennej liczby jednostek kodu do kodowania znaku.
Zbiór znaków, które można zakodować w UTF-8 jest dokładnie taki sam jak w przypadku UTF-16 lub UTF-32, a mianowicie wszystkie znaki Unicode. Wszystkie kodują całą przestrzeń kodowania Unicode, która obejmuje nawet znaki niebędące znakami i nieprzypisane punkty kodowe.
źródło
Chociaż zgadzam się z mpen w sprawie obecnych maksymalnych kodów UTF-8 (2164864) (wymienionych poniżej, nie mogłem skomentować jego), jest on wyłączony o 2 poziomy, jeśli usuniesz 2 główne ograniczenia UTF-8: tylko 4 bajty limitu i kodów 254 i 255 nie można użyć (usunął tylko limit 4-bajtowy).
Kod startowy 254 jest zgodny z podstawowym układem bitów początkowych (wielobitowa flaga ustawiona na 1, liczba 6 jedynek i terminal 0, brak zapasowych bitów), co daje 6 dodatkowych bajtów do pracy (6 grup 10xxxxxx, dodatkowe 2 ^ 36 kodów).
Początkowy kod 255 nie jest dokładnie zgodny z podstawową konfiguracją, nie ma terminala 0, ale używane są wszystkie bity, co daje 7 dodatkowych bajtów (flaga wielobitowa ustawiona na 1, liczba 7 1 i brak terminala 0, ponieważ wszystkie bity są używane ; 7 grup 10xxxxxx, dodatkowe 2 ^ 42 hasła).
Dodanie ich daje ostateczny maksymalny zestaw znaków, który można przedstawić, wynoszący 4468982745216. To więcej niż wszystkie znaki w obecnym użyciu, stare lub martwe języki oraz wszelkie języki, które uważa się za utracone. Anielski lub niebiański scenariusz jest ktoś?
Istnieją również kody jednobajtowe, które są pomijane / ignorowane w standardzie UTF-8 oprócz 254 i 255: 128-191 i kilku innych. Niektóre są używane lokalnie przez klawiaturę, przykładowy kod 128 to zwykle usuwający backspace. Inne kody początkowe (i związane z nimi zakresy) są nieprawidłowe z co najmniej jednego powodu ( https://en.wikipedia.org/wiki/UTF-8#Invalid_byte_sequences ).
źródło
Unicode jest mocno związany z UTF-8. Unicode obsługuje 2 ^ 21 punktów kodowych (2097152 znaków), czyli dokładnie tyle samo punktów kodowych, ile obsługuje UTF-8. Oba systemy rezerwują tę samą „martwą” przestrzeń i strefy ograniczone dla punktów kodowych itp. ... od czerwca 2018 najnowsza wersja, Unicode 11.0, zawiera repertuar 137.439 znaków
Ze standardu Unicode. Często zadawane pytania dotyczące Unicode
Ze strony Wikipedii UTF-8. Opis UTF-8
źródło