Ogólne#
Encoding#
W tym miejscu umieszczam powtarzające się specyficzne pojęcia i algorytmy w dziale ENCODING, czyli mogą mieć one zastosowanie dla wszystkich interfejsów z tego działu.
Preface#
Kodowanie UTF-8 jest najwłaściwszym kodowaniem przy współpracy z Unicode (uniwersalnym zestawem znaków). Z tego względu dla nowych protokołów oraz formatów, a także istniejących formatów umieszczanych w nowych kontekstach, specyfikacja kodowania wymaga (i definiuje) użycie kodowania UTF-8.
Inne (zaszłościowe) kodowania zostały w pewnym stopniu zdefiniowane w przeszłości. Jednakże aplikacje klienckie nie zawsze zaimplementowały je w ten sam sposób, nie zawsze stosowały te same etykiety, i często różniły się w niezdefiniowanych i w formalnie zastrzeżonych obszarach kodowania. Specyfikacja kodowania uwzględnia te luki, tak aby nowe aplikacje klienckie nie musiały stosować inżynierii wstecznej względem już wdrożonych implementacji kodowania, a istniejące aplikacje klienckie były z nią zgodne.
Specyfikacja kodowania definiuje wszystkie te kodowania, ich algorytmy służące do przejścia z bajtów do wartości skalarnych (i odwrotnie), a także ich nazwy kanoniczne oraz etykiety identyfikacyjne. Specyfikacja definiuje również API, aby udostępnić część algorytmów kodowania dla JavaScriptu.
Aplikacje klienckie znacznie odbiegły od zarejestrowanych etykiet wymienionych w dokumencie IANA Character Sets registry. Aby zatrzymać dalsze rozprzestrzenianie starszych kodowań, specyfikacja ta została opisana na tyle szczegółowo, że nie ma potrzeby stosowania rejestracji. Trzeba podkreślić, że specyfikacja nie wprowadza mechanizmu dla rozszerzenia jakichkolwiek aspektów kodowania.
Security background#
Istnieje pewien zestaw błędów związanych z kwestią bezpieczeństwa kodowania, gdzie producent i konsument nie zgadzają się na użycie kodowania, lub na sposób implementacji tego kodowania. Dla przykładu, w 2011 roku zgłoszono atak, gdzie górny bajt 0x82
w kodowaniu Shift_JIS został użyty do "zamaskowania" dolnego bajtu 0x22
w źródle JSON, którym atakujący mógł kontrolować niektóre pola. Producent nie widział żadnego problemu, nawet jeśli była to nielegalna kombinacja bajtów. Konsument dekodował je jako pojedynczy U+FFFD
i w konsekwencji zmieniał ogólną interpretację, gdzie U+0022
było ważnym separatorem. Od tej pory dekodery dla kodowań, które używają wielu bajtów dla wartości skalarnych wymagają, że dla nielegalnej kombinacji bajtów wartość skalarna w zakresie U+0000
do U+007F
, włącznie, nie może być "zamaskowana". Dla uprzednio wymienionej sekwencji wyjście stanowiłoby kombinację U+FFFD U+0022
.
Jest to większy problem dla kodowań, które mapują cokolwiek będącego bajtem ASCII na coś innego niż punkt kodowy ASCII, gdzie górny bajt jest nieobecny. Są to kodowania "niekompatybilne z ASCII" i inne niż ISO-2022-JP, UTF-16BE oraz UTF-16LE, które niestety są wymagane ze względu na wdrożone treści, nie są obsługiwane. Obecnie trwa ustalanie, czy więcej etykiet innych takich kodowań może być mapowanych do kodowania replacement, zamiast odwoływać się do nieznanego kodowania (Encoding - Bug 8, Encoding - Bug 21057). Przykładem ataku może być wstrzyknięcie starannie spreparowanej treści do zasobu, a następnie zachęcenie użytkownika do nadpisania kodowania, w wyniku np. wykonania skryptu.
Kodery używane przez adresy URL znalezione w HTML i funkcje formularzy HTML również mogą powodować lekkie utraty informacji, gdy używane kodowanie nie może reprezentować wszystkich wartości skalarnych. Dla przykładu, gdy zasób używa kodowania windows-1252 to serwer nie będzie w stanie odróżnić wprowadzonych przez użytkownika do formularza końcowych danych w postaci "💩
" i "💩
".
Wymienione tutaj problemy stracą na aktualności wraz z sukcesywnym stosowaniem wyłącznie kodowania UTF-8, i są jednymi z wielu powodów, dla których kodowanie to jest obowiązkowe dla wszystkich nowych funkcji w platformie.
Zobacz także rozdział "Browser UI".
Terminology#
Szesnastkowe liczy są poprzedzane prefiksem "0x
".
W równaniach matematycznych wszystkie liczby są całkowite (integers), dodawanie jest reprezentowane przez "+", odejmowanie przez "-", mnożenie przez "*", dzielenie przez "/", reszta z dzielenia (znana jako modulo) przez "%", logiczne lewe przesunięcie przez "<<", logiczne prawe przesunięcie przez ">>", bitowy iloczyn przez "&" oraz bitowa alternatywa przez "|". Operacja "floor(x)" wskazuje na największą liczbę całkowitą nie większą od x.
Dla logicznego prawego przesunięcia operandy muszą mieć co najmniej 21-bitową precyzję.
byte
Bajt # (byte) to sekwencja ośmiu bitów, reprezentowany przez dwucyfrową liczbę szesnastkową w zakresie 0x00
do 0xFF
włącznie (0-255
).
ASCII byte
Bajt ASCII # (ASCII byte) to bajt w zakresie 0x00
do 0x7F
włącznie (0-127
) .
code point
Punkt kodowy # (code point) to punkt kodowy Unicode, reprezentowany przez liczbę szesnastkową składającą się z czterech do sześciu cyfr, zazwyczaj poprzedzaną prefiksem "U+
". W równaniach matematycznych i indeksach punkty kodowe są poprzedzane prefiksem "0x
".
scalar value
Wartość skalarna # (scalar value) to punkt kodowy, który nie jest w zakresie U+D800
do U+DFFF
włącznie (tzn. nie jest surogatem).
ASCII code point
Punkt kodowy ASCII # (ASCII code point) to punkt kodowy w zakresie U+0000
do U+007F
włącznie (0-127
).
ASCII whitespace
Białe znaki ASCII # (ASCII whitespace) to punkty kodowe U+0020
(SPACE), U+0009
(CHARACTER TABULATION), U+000A
(LINE FEED), U+000C
(FORM FEED) i U+000D
(CARRIAGE RETURN).
ASCII digits
Cyfry ASCII # (ASCII digits) to punkty kodowe w zakresie U+0030
do U+0039
włącznie (0-9
).
string
Łańcuch znaków # (string) to sekwencja punktów kodowych.
ASCII case-insensitive
Porównanie dwóch łańcuchów znaków pod względem nieczułości na wielkości znaków ASCII # (ASCII case-insensitive) oznacza ich dokładne porównanie, tj. punktu kodowego do punktu kodowego, z wyjątkiem znaków z zakresu U+0041...U+005A
włącznie (tj. od LATIN CAPITAL LETTER A do LATIN CAPITAL LETTER Z) i odpowiadających im znaków z zakresu U+0061...U+007A
włącznie (tj. od LATIN SMALL LETTER A do LATIN SMALL LETTER Z), które uważa się za zgodne. W uproszczeniu oznacza to, że wielkość liter ASCII przy porównaniu nie ma znaczenia.
token
Słowo # (token) to fragment danych, jak np. bajt czy punkt kodowy.
stream
Strumień # (stream) to uporządkowana sekwencja słów.
end-of-stream
Koniec strumienia # (end-of-stream) to specjalne słowo, które wskazuje że nie ma więcej słów w strumieniu.
read
Kiedy słowo jest odczytywane # (read) ze strumienia, to pierwsze słowo ze strumienia musi być zwrócone i jednocześnie usunięte, w przeciwnym razie musi zostać zwrócony koniec strumienia.
prepended
Kiedy jedno lub więcej słów poprzedza # (prepended) strumień, to słowa te muszą być wstawione, zgodnie z kolejnością, przed pierwszym słowem w strumieniu.
Poprzedzenie strumienia "hello world
" sekwencją słów 💩
zwróci strumień "💩 hello world
". Następny słowem do odczytu będzie "&
".
pushed
Kiedy jedno lub więcej słów następuje # (pushed) po strumieniu, to słowa te muszą być wstawione, zgodnie z kolejnością, za ostatnim słowem w strumieniu.
Encodings#
encoding
name
label
Kodowanie # (encoding) definiuje mapowanie z sekwencji wartości skalarnych do sekwencji bajtów (i odwrotnie). Każde kodowanie posiada nazwę # (name) oraz jedną lub więcej etykiet # (label).
W potocznym obiektu nazwę w kodowaniu często określa się także terminem nazwa kanoniczna.
Encoders and decoders#
decoder
encoder
Każde kodowanie jest skojarzone z dekoderem # (decoder) i większość z nich także z koderem # (encoder).
Kodowania, które nie posiadają kodera, to np. replacement, UTF-16BE i UTF-16LE.
handler
finished
error
continue
Każdy dekoder i koder posiada algorytm uchwycenia # (handler). Algorytm uchwycenia pobiera jako wejście strumień i słowo, a następnie zwraca zakończenie # (finished), jedno lub więcej słów, błąd # (error) opcjonalnie z punktem kodowym, lub kontynuowanie # (continue).
error mode
Trybem błędu # (error mode), jak opisano niżej, może być "replacement
" (domyślnie) lub "fatal
" dla dekodera oraz "fatal
" (domyślnie) lub "html
" dla kodera.
Procesor XML będzie ustawiał tryb błędu na "fatal
".
Tryb błędu w postaci "html
" istnieje ze względu na adresy URL oraz formularze HTML, które wymagają nieprzerywania starszych koderów. Zastosowanie "html
" powoduje emitowanie sekwencji, którą nie można odróżnić od prawidłowego wejścia, a zatem może prowadzić do cichej utraty danych. Aby temu zapobiec deweloperzy są zachęcani do korzystania z kodowania UTF-8.
run
Aby uruchomić # (run) dekoder lub koder encoderDecoder skojarzony z kodowaniem, z wejściowym strumieniem input, wyjściowym strumieniem output oraz opcjonalnym trybem błędu mode, należy wykonać następujące kroki:
- Jeśli mode nie został przekazany, to ustaw go na "
replacement
" jeśli encoderDecoder jest dekoderem, w przeciwnym razie na "fatal
". - Niech encoderDecoderInstance będzie nowym encoderDecoder.
Dopóki (while) prawda:
- Niech result będzie wynikiem przetwarzania z przekazaniem rezultatu odczytania z input dla encoderDecoderInstance, input, output i mode.
- Jeśli result nie jest kontynuowaniem, to zwróć result.
- W przeciwnym razie niczego nie rób.
process
Aby przetworzyć # (process) słowo token dla instancji dekodera lub kodera encoderDecoderInstance skojarzonego z kodowaniem, wejściowego strumienia input, wyjściowego strumienia output oraz opcjonalnego trybu błędu mode, należy wykonać następujące kroki:
- Jeśli mode nie został przekazany, to ustaw go na "
replacement
" jeśli encoderDecoderInstance jest instancją dekodera, w przeciwnym razie na "fatal
". - Niech result będzie wynikiem uruchomienia algorytmu uchwycenia skojarzonego z encoderDecoderInstance na input i token.
- Jeśli result jest kontynuowaniem lub zakończeniem, to zwróć result.
- W przeciwnym razie, jeśli result jest jednym lub większą liczbą słów, to niech result następuje po output.
W przeciwnym razie, jeśli result jest błędem to, w zależności od mode, wykonaj poniższe podkroki:
- "
replacement
" - Niech
U+FFFD
następuje po output.
- Niech
- "
html
" - Niech połączenie
U+0026
(&
),U+0023
(#
), po których następuje najkrótsza sekwencja cyfr ASCII reprezentująca punkt kodowy z result w zapisie dziesiętnym, po których następujeU+003B
(;
) poprzedza input.
- Niech połączenie
- "
fatal
" - Zwróć błąd.
- "
- Zwróć kontynuowanie.
Names and labels#
Poniższa tabela wymienia wszystkie kodowania i ich etykiety, które muszą być obsługiwane przez aplikacje klienckie. Żadne inne kodowania lub etykiety nie mogą być wspierane przez aplikacje klienckie.
Autorzy muszą używać kodowania UTF-8 i muszą używać etykiety "uff-8
" (nieczułej na wielkość znaków ASCII) do ich identyfikacji.
Nowe protokoły i formaty, a także istniejące formaty umieszczane w nowych kontekstach, muszą używać wyłącznie kodowania UTF-8. Jeśli te protokoły i formaty potrzebują wyeksponowania nazwy lub etykiety z kodowania, to muszą je eksponować jako "uff-8
".
get an encoding
Aby pobrać kodowanie # (get an encoding) z łańcucha znakowego label należy wykonać następujące kroki:
- Usuń wszystkie początkowe i końcowe białe znaki ASCII z label.
- Jeśli label pasuje pod względem nieczułości na wielkość znaków ASCII do którejkolwiek etykiety wymienionej w poniższej tabeli, to zwróć odpowiadające jej kodowanie. W przeciwnym razie zwróć niepowodzenie.
Jest to o wiele prostszy i bardziej restrykcyjny algorytm mapowania etykiet do kodowań niż wymagania z "section 1.4 of Unicode Technical Standard", chociaż wciąż zgodny z wdrożonymi treściami.
Nazwa | Etykieta |
---|---|
The Encoding | |
UTF-8 | "unicode-1-1-utf-8 " |
"utf-8 " | |
"utf8 " | |
Legacy single-byte encodings | |
IBM866 | "866 " |
"cp866 " | |
"csibm866 " | |
"ibm866 " | |
ISO-8859-2 | "csisolatin2 " |
"iso-8859-2 " | |
"iso-ir-101 " | |
"iso8859-2 " | |
"iso88592 " | |
"iso_8859-2 " | |
"iso_8859-2:1987 " | |
"l2 " | |
"latin2 " | |
ISO-8859-3 | "csisolatin3 " |
"iso-8859-3 " | |
"iso-ir-109 " | |
"iso8859-3 " | |
"iso88593 " | |
"iso_8859-3 " | |
"iso_8859-3:1988 " | |
"l3 " | |
"latin3 " | |
ISO-8859-4 | "csisolatin4 " |
"iso-8859-4 " | |
"iso-ir-110 " | |
"iso8859-4 " | |
"iso88594 " | |
"iso_8859-4 " | |
"iso_8859-4:1988 " | |
"l4 " | |
"latin4 " | |
ISO-8859-5 | "csisolatincyrillic " |
"cyrillic " | |
"iso-8859-5 " | |
"iso-ir-144 " | |
"iso8859-5 " | |
"iso88595 " | |
"iso_8859-5 " | |
"iso_8859-5:1988 " | |
ISO-8859-6 | "arabic " |
"asmo-708 " | |
"csiso88596e " | |
"csiso88596i " | |
"csisolatinarabic " | |
"ecma-114 " | |
"iso-8859-6 " | |
"iso-8859-6-e " | |
"iso-8859-6-i " | |
"iso-ir-127 " | |
"iso8859-6 " | |
"iso88596 " | |
"iso_8859-6 " | |
"iso_8859-6:1987 " | |
ISO-8859-7 | "csisolatingreek " |
"ecma-118 " | |
"elot_928 " | |
"greek " | |
"greek8 " | |
"iso-8859-7 " | |
"iso-ir-126 " | |
"iso8859-7 " | |
"iso88597 " | |
"iso_8859-7 " | |
"iso_8859-7:1987 " | |
"sun_eu_greek " | |
ISO-8859-8 | "csiso88598e " |
"csisolatinhebrew " | |
"hebrew " | |
"iso-8859-8 " | |
"iso-8859-8-e " | |
"iso-ir-138 " | |
"iso8859-8 " | |
"iso88598 " | |
"iso_8859-8 " | |
"iso_8859-8:1988 " | |
"visual " | |
ISO-8859-8-I | "csiso88598i " |
"iso-8859-8-i " | |
"logical " | |
ISO-8859-10 | "csisolatin6 " |
"iso-8859-10 " | |
"iso-ir-157 " | |
"iso8859-10 " | |
"iso885910 " | |
"l6 " | |
"latin6 " | |
ISO-8859-13 | "iso-8859-13 " |
"iso8859-13 " | |
"iso885913 " | |
ISO-8859-14 | "iso-8859-14 " |
"iso8859-14 " | |
"iso885914 " | |
ISO-8859-15 | "csisolatin9 " |
"iso-8859-15 " | |
"iso8859-15 " | |
"iso885915 " | |
"iso_8859-15 " | |
"l9 " | |
ISO-8859-16 | "iso-8859-16 " |
KOI8-R | "cskoi8r " |
"koi " | |
"koi8 " | |
"koi8-r " | |
"koi8_r " | |
KOI8-U | "koi8-ru " |
"koi8-u " | |
macintosh | "csmacintosh " |
"mac " | |
"macintosh " | |
"x-mac-roman " | |
windows-874 | "dos-874 " |
"iso-8859-11 " | |
"iso8859-11 " | |
"iso885911 " | |
"tis-620 " | |
"windows-874 " | |
windows-1250 | "cp1250 " |
"windows-1250 " | |
"x-cp1250 " | |
windows-1251 | "cp1251 " |
"windows-1251 " | |
"x-cp1251 " | |
windows-1252 | "ansi_x3.4-1968 " |
"ascii " | |
"cp1252 " | |
"cp819 " | |
"csisolatin1 " | |
"ibm819 " | |
"iso-8859-1 " | |
"iso-ir-100 " | |
"iso8859-1 " | |
"iso88591 " | |
"iso_8859-1 " | |
"iso_8859-1:1987 " | |
"l1 " | |
"latin1 " | |
"us-ascii " | |
"windows-1252 " | |
"x-cp1252 " | |
windows-1253 | "cp1253 " |
"windows-1253 " | |
"x-cp1253 " | |
windows-1254 | "cp1254 " |
"csisolatin5 " | |
"iso-8859-9 " | |
"iso-ir-148 " | |
"iso8859-9 " | |
"iso88599 " | |
"iso_8859-9 " | |
"iso_8859-9:1989 " | |
"l5 " | |
"latin5 " | |
"windows-1254 " | |
"x-cp1254 " | |
windows-1255 | "cp1255 " |
"windows-1255 " | |
"x-cp1255 " | |
windows-1256 | "cp1256 " |
"windows-1256 " | |
"x-cp1256 " | |
windows-1257 | "cp1257 " |
"windows-1257 " | |
"x-cp1257 " | |
windows-1258 | "cp1258 " |
"windows-1258 " | |
"x-cp1258 " | |
x-mac-cyrillic | "x-mac-cyrillic " |
"x-mac-ukrainian " | |
Legacy multi-byte Chinese (simplified) encodings | |
GBK | "chinese " |
"csgb2312 " | |
"csiso58gb231280 " | |
"gb2312 " | |
"gb_2312 " | |
"gb_2312-80 " | |
"gbk " | |
"iso-ir-58 " | |
"x-gbk " | |
gb18030 | "gb18030 " |
Legacy multi-byte Chinese (traditional) encodingss | |
Big5 | "big5 " |
"big5-hkscs " | |
"cn-big5 " | |
"csbig5 " | |
"x-x-big5 " | |
Legacy multi-byte Japanese encodings | |
EUC-JP | "cseucpkdfmtjapanese " |
"euc-jp " | |
"x-euc-jp " | |
ISO-2022-JP | "csiso2022jp " |
"iso-2022-jp " | |
Shift_JIS | "csshiftjis " |
"ms932 " | |
"ms_kanji " | |
"shift-jis " | |
"shift_jis " | |
"sjis " | |
"windows-31j " | |
"x-sjis " | |
Legacy multi-byte Korean encodings | |
EUC-KR | "cseuckr " |
"csksc56011987 " | |
"euc-kr " | |
"iso-ir-149 " | |
"korean " | |
"ks_c_5601-1987 " | |
"ks_c_5601-1989 " | |
"ksc5601 " | |
"ksc_5601 " | |
"windows-949 " | |
Legacy miscellaneous encodings | |
replacement | "csiso2022kr " |
"hz-gb-2312 " | |
"iso-2022-cn " | |
"iso-2022-cn-ext " | |
"iso-2022-kr " | |
UTF-16BE | "utf-16be " |
UTF-16LE | "utf-16 " |
"utf-16le " | |
x-user-defined | "x-user-defined " |
Wszystkie kodowania i ich etykiety są także dostępne w specjalnie przygotowanym pliku encodings.json
.
Output encodings#
get an output encoding
Aby pobrać wyjściowe kodowanie # (get an output encoding ) z kodowania encoding należy wykonać następujące kroki:
- Jeśli encoding wskazuje na replacement, UTF-16BE lub UTF-16LE, to zwróć UTF-8.
- Zwróć encoding.
Algorytm pobrania wyjściowego kodowania jest użyteczny przy parsowaniu adresów URL lub wysyłania formularzy HTML, dla których został zdefiniowany.
Indexes#
index
Większość starodawnych kodowań korzysta z indeksu # (index). Indeks to uporządkowany zestaw wskaźników i odpowiadających punktów kodowych. W indeksie wskaźniki są unikatowe i punkty kodowe mogą się powtarzać.
Wydajne implementacje mają prawdopodobnie dwa indeksy na kodowanie. Jeden zoptymalizowany dla jego dekodera i jeden dla jego kodera.
Aby znaleźć wskaźniki i odpowiadające im punkty kodowe w indeksie niech lines będzie wynikiem podziału zawartości źródła względem U+000A
(LINE FEED). Następnie należy usunąć wszystkie elementy w lines, które są puste lub zaczynają się od U+000A
(LINE FEED). Wskaźniki i odpowiadające im punkty kodowe są odnajdywane poprzez podzielenie każdego elementu w lines względem U+0009
(CHARACTER TABULATION). Pierwsza część podziału jest wskaźnikiem (jako liczba dziesiętna), a druga jest odpowiadającym punktem kodowym (jako liczba szesnastkowa). Inne części podziału są nieistotne.
Aby ułatwić ewentualne śledzenie zmian w indeksach, to w każdym z nich umieszczono identyfikator (Identifier) i datę (Date). Jeśli identyfikator uległ zmianie, to indeks też.
index code point
Punktem kodowym indeksu # (index code point) dla wskaźnika pointer w indeksie index jest punkt kodowy odpowiadający pointer w index, lub wartość null
jeśli pointer nie znajduje się w index.
index pointer
Wskaźnikiem indeksu # (index pointer) dla punktu kodowego code point w indeksie index jest pierwszy wskaźnik odpowiadający code point w index, lub wartość null
jeśli code point nie znajduje się w index.
Poniżej wymienione zostały indeksy definiowane przez specyfikację kodowania, z wykluczeniem indeksów jednobajtowych, które posiadają własną tabelę.
Indeks | Uwagi | |
---|---|---|
indeks Big5 # | index-big5.txt | To pasuje do standardu Big5 w kombinacji z Hong Kong Supplementary Character Set i innymi popularnymi rozszerzeniami. |
indeks EUC-KR # | index-euc-kr.txt | To pasuje do standardu KS X 1001 i Unified Hangul Code, znanych wspólnie jako Windows Codepage 949. |
indeks gb18030 # | index-gb18030.txt | To pasuje do standardu GB18030-2005 dla punktów kodowych zakodowanych jako dwa bajty, z wyjątkiem 0xA3 0xA0 mapowanego do U+3000 , co jest kompatybilne z wdrożonymi treściami. |
indeks gb18030 ranges # | index-gb18030-ranges.txt | Indeks ten działa inaczej niż wszystkie inne. Wykaz wszystkich punktów kodowych zwróciłby rezultat w postaci miliona pozycji, podczas gdy mogą one być reprezentowane w poręcznych 207 zakresach w kombinacji z prostymi granicznymi limitami. To jedynie powierzchniowo pasuje do standardu GB18030-2005 dla punktów kodowych zakodowanych jako cztery bajty. Zobacz także punkt kodowy indeksu gb18030 range i wskaźnik indeksu gb18030 range wymienione niżej. |
indeks jis0208 # | index-jis0208.txt | To jest standard JIS X 0208 z uwzględnieniem wcześniejszych rozszerzeń od IBM i NEC. |
indeks jis0212 # | index-jis0212.txt | To jest standard JIS X 0212. Ze względu na brak szerokiego wsparcia indeks ten jest używany jedynie przez dekoder EUC-JP. |
index gb18030 ranges code point
Punktem kodowym indeksu gb18030 ranges # (index gb18030 ranges code point) dla wskaźnika pointer jest wartość zwracana przez wykonanie następujących kroków:
- Jeśli pointer jest większy od
39419
i mniejszy od189000
, lub pointer jest większy od1237575
, to zwróć wartośćnull
. - Jeśli pointer jest wartością
7457
, to zwróć punkt kodowyU+E7C7
. - Niech offset będzie ostatnim wskaźnikiem w indeksie gb18030 ranges, który jest równy lub mniejszy od pointer i niech code point offset będzie jego odpowiadającym punktem kodowym.
- Zwróć punkt kodowy, którego wartością jest wynik obliczenia code point offset + pointer - offset.
index gb18030 ranges pointer
Wskaźnikiem indeksu gb18030 ranges # (index gb18030 ranges pointer) dla punktu kodowego code point jest wartość zwracana przez wykonanie następujących kroków:
- Jeśli code point jest wartością
U+E7C7
, to zwróć wskaźnik7457
. - Niech offset będzie ostatnim punktem kodowym w indeksie gb18030 ranges, który jest równy lub mniejszy od code point i niech pointer offset będzie jego odpowiadającym indeksem.
- Zwróć wskaźnik, którego wartością jest wynik obliczenia pointer offset + code point - offset.
index Shift_JIS pointer
Wskaźnikiem indeksu Shift_JIS # (index Shift_JIS pointert) dla punktu kodowego code point jest wartość zwracana przez wykonanie następujących kroków:
- Niech index będzie indeksem jis0208 z wykluczeniem wszystkich wskaźników w zakresie
8272
do8835
włącznie. - Zwróć wskaźnik indeksu dla code point w index.
index Big5 pointer
Wskaźnikiem indeksu Big5 # (index Big5 pointer) dla punktu kodowego code point jest wartość zwracana przez wykonanie następujących kroków:
Niech index będzie indeksem Big5 z wykluczeniem wszystkich wskaźników mniejszych od wyniku obliczenia (
0xA1
-0x81
) *157
.Literalnie wyklucza zwrócenie rozszerzenia Hong Kong Supplementary Character Set.
Jeśli code point ma wartość
U+2550
,U+255E
,U+2561
,U+256A
,U+5341
lubU+5345
, to zwróć ostatni wskaźnik odpowiadający code point w index.Istnieją inne zduplikowane punkty kodowe, ale dla nich stosowany jest pierwszy wskaźnik.
- Zwróć wskaźnik indeksu dla code point w index.
Wszystkie indeksy są także dostępne w specjalnie przygotowanym pliku indexes.json
(indeks gb18030 ranges ma tutaj inny format, tak aby mógł reprezentować zakresy).
Specification hooks#
Poniższe algorytmy dekodowania, dekodowania w UTF-8, dekodowania w UTF-8 bez BOM, dekodowania w UTF-8 bez BOM lub przerwy, kodowania i kodowania w UTF-8 są definiowane z uwagi na częste wykorzystanie przez inne specyfikacje. Dekodowanie w UTF-8 powinno być używane przez nowe formaty. Algorytm pobrania kodowania może być użyty jako pierwszy do przekształcenia etykiety na kodowanie.
decode
Aby zdekodować # (decode) strumień bajtów stream z użyciem kodowania encoding należy wykonać następujące kroki:
- Niech buffer będzie pustą sekwencją bajtów.
- Niech BOM seen flag będzie nieustawiona.
- Odczytuj bajty ze stream do buffer dopóki buffer zawiera trzy bajty lub odczyt zwraca koniec strumienia.
Dla każdego (for each) wiersza w poniższej tabeli, począwszy od pierwszego i kierując się w dół, jeśli pierwsze bajty w buffer pasują do wszystkich bajtów wymienionych w pierwszej kolumnie, to ustaw encoding na kodowanie wymienione w komórce drugiej kolumny tego wiersza i ustaw BOM seen flag.
BOM (Byte Order Mark) Kodowanie 0xEF 0xBB 0xBF
UTF-8 0xFE 0xFF
UTF-16BE 0xFF 0xFE
UTF-16LE Dla kompatybilności z już wdrożonymi treściami znacznik kolejności bajtów (znany również jako BOM) jest uważany za bardziej wiarygodny, niż cokolwiek innego. W kontekstach stosujących HTTP jest to naruszenie semantyki dla nagłówka `
Content-Type
`.- Jeśli BOM seen flag jest nieustawiona, to niech buffer poprzedza stream.
- W przeciwnym razie, jeśli BOM seen flag jest ustawiona, encoding nie jest UTF-8 i buffer zawiera trzy bajty, to niech ostatni bajt z buffer poprzedza stream.
- Niech output będzie strumieniem punktów kodowych.
- Uruchom skojarzony z encoding dekoder przekazując stream i output.
- Zwróć output.
UTF-8 decode
Aby zdekodować w UTF-8 # (UTF-8 decode) strumień bajtów stream należy wykonać następujące kroki:
- Niech buffer będzie pustą sekwencją bajtów.
- Odczytaj trzy bajty ze stream do buffer.
- Jeśli buffer nie pasuje do
0xEF 0xBB 0xBF
, to niech buffer poprzedza stream. - Niech output będzie strumieniem punktów kodowych.
- Uruchom skojarzony z UTF-8 dekoder przekazując stream i output.
- Zwróć output.
UTF-8 decode without BOM
Aby zdekodować w UTF-8 bez BOM # (UTF-8 decode without BOM) strumień bajtów stream należy wykonać następujące kroki:
- Niech output będzie strumieniem punktów kodowych.
- Uruchom skojarzony z UTF-8 dekoder przekazując stream i output.
- Zwróć output.
UTF-8 decode without BOM or fail
Aby zdekodować w UTF-8 bez BOM lub przerwać # (UTF-8 decode without BOM or fail) strumień bajtów stream należy wykonać następujące kroki:
- Niech output będzie strumieniem punktów kodowych.
- Niech potentialError będzie wynikiem uruchomienia skojarzonego z UTF-8 dekoder przekazując stream, output i "
fatal
". - Jeśli potentialError jest błędem, to zwróć niepowodzenie.
- Zwróć output.
encode
Aby zakodować # (encode) strumień punktów kodowych stream z użyciem kodowania encoding należy wykonać następujące kroki:
- Aseracji: encoding nie wskazuje na replacement, UTF-16BE lub UTF-16LE.
- Niech output będzie strumieniem bajtów.
- Uruchom skojarzony z encoding koder przekazując stream, output i "
html
". - Zwróć output.
Jest to zaszłościowy uchwyt dla adresów URL i formularzy HTML. Warstwa kodowania w UTF-8 na szczycie jest bezpieczna gdyż nigdy nie wywołuje błędów.
UTF-8 encode
Aby zakodować w UTF-8 # (UTF-8 encode) strumień punktów kodowych stream należy zwrócić wynik kodowania stream z użyciem kodowania UTF-8.
The encoding#
UTF-8#
UTF-8 decoder#
Dekoder skojarzony z UTF-8 jest powiązany z punktem kodowym UTF-8 # (UTF-8 code point), widzianymi bajtami UTF-8 # (UTF-8 bytes seen), potrzebnymi bajtami UTF-8 # (UTF-8 bytes needed) [wszystkie z początkową wartością 0
], dolną granicą UTF-8 # (UTF-8 lower boundary) [z początkową wartością 0x80
] i górną granicą UTF-8 # (UTF-8 upper boundary) [z początkową wartością 0xBF
].
Algorytm uchwycenia w dekoderze skojarzonym z UTF-8 pobiera strumień stream i bajt byte, a następnie wykonuje następujące kroki:
- Jeśli byte jest końcem strumienia i potrzebne bajty UTF-8 nie są
0
, to ustaw potrzebne bajty UTF-8 na0
i zwróć błąd. - Jeśli byte jest końcem strumienia, to zwróć zakończenie.
Jeśli potrzebne bajty UTF-8 są
0
to, w zależności od byte, wykonaj poniższe podkroki:0x00
do0x7F
- Zwróć punkt kodowy, którego wartością jest byte.
0xC2
do0xDF
- Ustaw potrzebne bajty UTF-8 na
1
. Ustaw punkt kodowy UTF-8 na wynik obliczenia byte &
0x1F
.Pięć najmniej znaczących bitów w bajcie.
- Zwróć kontynuowanie.
- Ustaw potrzebne bajty UTF-8 na
0xE0
do0xEF
- Jeśli byte ma wartość
0xE0
, to ustaw dolną granicę UTF-8 na0xA0
. - Jeśli byte ma wartość
0xED
, to ustaw górną granicę UTF-8 na0x9F
. - Ustaw potrzebne bajty UTF-8 na
2
. Ustaw punkt kodowy UTF-8 na wynik obliczenia byte &
0xF
.Cztery najmniej znaczące bity w bajcie.
- Jeśli byte ma wartość
0xF0
do0xF4
- Jeśli byte ma wartość
0xF0
, to ustaw dolną granicę UTF-8 na0x90
. - Jeśli byte ma wartość
0xF4
, to ustaw górną granicę UTF-8 na0x8F
. - Ustaw potrzebne bajty UTF-8 na
3
. Ustaw punkt kodowy UTF-8 na wynik obliczenia byte &
0x7
.Trzy najmniej znaczące bity w bajcie.
- Jeśli byte ma wartość
- W przeciwnym razie
- Zwróć błąd.
Zwróć kontynuowanie.
Jeśli byte nie jest w zakresie dolna granica UTF-8 do górna granica UTF-8, włącznie, to wykonaj poniższe podkroki:
- Ustaw punkt kodowy UTF-8, potrzebne bajty UTF-8 i widziane bajty UTF-8 na
0
, ustaw dolną granicę UTF-8 na0x80
i górną granicę UTF-8 na0xBF
. - Niech byte poprzedza stream.
- Zwróć błąd.
- Ustaw punkt kodowy UTF-8, potrzebne bajty UTF-8 i widziane bajty UTF-8 na
- Ustaw dolną granicę UTF-8 na
0x80
i górną granicę UTF-8 na0xBF
. Ustaw punkt kodowy UTF-8 na wynik obliczenia (punkt kodowy UTF-8 <<
6
) | (byte &0x3F
).Przesuwa o sześć miejsc w lewo istniejące bity w punkcie kodowym UTF-8 i ustawia nowo opuszczone najmniej znaczące bity na sześć najmniej znaczących bitów z bajtu.
- Zwiększ widziane bajty UTF-8 o jeden.
- Jeśli widziane bajty UTF-8 nie są równe potrzebnym bajtom UTF-8, to zwróć kontynuowanie.
- Niech code point będzie punktem kodowym UTF-8.
- Ustaw punkt kodowy UTF-8, potrzebne bajty UTF-8 i widziane bajty UTF-8 na
0
. - Zwróć punkt kodowy, którego wartością jest code point.
Powyższe ograniczenia dla dekodera UTF-8 pasują do zaleceń "Best Practices for Using U+FFFD" ze standardu Unicode. Żadne inne zachowanie nie jest dozwolone przez specyfikację kodowania (inne algorytmy, które osiągają ten sam rezultat są oczywiście prawidłowe, a nawet wskazane).
UTF-8 encoder#
Algorytm uchwycenia w koderze skojarzonym z UTF-8 pobiera strumień stream i punkt kodowy code point, a następnie wykonuje następujące kroki:
- Jeśli code point jest końcem strumienia, to zwróć zakończenie.
- Jeśli code point jest punktem kodowym ASCII, to zwróć bajt, którego wartością jest code point.
Ustaw count i offset w zależności od zakresu, w którym znajduje się code point:
U+0080
doU+07FF
włącznie- count na
1
i offset na0xC0
. U+0800
doU+FFFF
włącznie- count na
2
i offset na0xE0
. U+10000
doU+10FFFF
włącznie- count na
3
i offset na0xF0
.
- Niech bytes będzie sekwencją bajtów, której pierwszy bajt to wynik obliczenia (code point >> (
6
* count)) + offset. Dopóki (while) count jest większy od
0
, to wykonaj poniższe podkroki:- Ustaw temp na wynik obliczenia code point >> (
6
* count -1
)). - Dodaj do bytes wynik obliczenia
0x80
| (temp &0x3F
). - Zmniejsz count o jeden.
- Ustaw temp na wynik obliczenia code point >> (
- Zwróć, zgodnie z kolejnością, bajty z bytes.
Algorytm ten ma identyczne działanie z algorytmem opisywanym w standardzie Unicode. Został umieszczony w specyfikacji kodowania jedynie dla zapewnienia kompletności opisów.
Legacy single-byte encodings#
single-byte encoding
Kodowanie, gdzie każdy bajt jest jednym punktem kodowym lub niczym, to kodowanie jednobajtowe # (single-byte encoding). Kodowania jednobajtowe dzielą ze sobą ten sam dekoder i koder.
index single-byte
Indeks kodowania jednobajtowego # (index single-byte), jako referencja wskazywana przez dekoder pojedynczego bajtu i koder pojedynczego bajtu, jest definiowany w poniższej tabeli i zależy od używanego kodowania jednobajtowego. Wszystkie oprócz dwóch kodowań jednobajtowych posiada unikatowy indeks.
Nazwa | Indeks | Brakujące wskaźniki |
---|---|---|
IBM866 # | index-ibm866.txt | - |
ISO-8859-2 # | index-iso-8859-2.txt | - |
ISO-8859-3 # | index-iso-8859-3.txt | 37 , 46 , 62 , 67 , 80 , 99 , 112 |
ISO-8859-4 # | index-iso-8859-4.txt | - |
ISO-8859-5 # | index-iso-8859-5.txt | - |
ISO-8859-6 # | index-iso-8859-6.txt | 33 , 34 , 35 , 37 , 38 , 39 , 40 , 41 , 42 , 43 , 46 , 47 , 48 , 49 , 50 , 51 , 52 , 53 , 54 , 55 , 56 , 57 , 58 , 60 , 61 , 62 , 64 , 91 , 92 , 93 , 94 , 95 , 115 , 116 , 117 , 118 , 119 , 120 , 121 , 122 , 123 , 124 , 125 , 126 , 127 |
ISO-8859-7 # | index-iso-8859-7.txt | 46 , 82 , 127 |
ISO-8859-8 # | index-iso-8859-8.txt | 33 , 63 , 64 , 65 , 66 , 67 , 68 , 69 , 70 , 71 , 72 , 73 , 74 , 75 , 76 , 77 , 78 , 79 , 80 , 81 , 82 , 83 , 84 , 85 , 86 , 87 , 88 , 89 , 90 , 91 , 92 , 93 , 94 , 123 , 124 , 127 |
ISO-8859-8-I # | ||
ISO-8859-10 # | index-iso-8859-10.txt | - |
ISO-8859-13 # | index-iso-8859-13.txt | - |
ISO-8859-14 # | index-iso-8859-14.txt | - |
ISO-8859-15 # | index-iso-8859-15.txt | - |
ISO-8859-16 # | index-iso-8859-16.txt | - |
KOI8-R # | index-koi8-r.txt | - |
KOI8-U # | index-koi8-u.txt | - |
macintosh # | index-macintosh.txt | - |
windows-874 # | index-windows-874.txt | 91 , 92 , 93 , 94 , 124 , 125 , 126 , 127 |
windows-1250 # | index-windows-1250.txt | - |
windows-1251 # | index-windows-1251.txt | - |
windows-1252 # | index-windows-1252.txt | - |
windows-1253 # | index-windows-1253.txt | 42 , 82 , 127 |
windows-1254 # | index-windows-1254.txt | - |
windows-1255 # | index-windows-1255.txt | 74 , 89 , 90 , 91 , 92 , 93 , 94 , 95 , 124 , 127 |
windows-1256 # | index-windows-1256.txt | - |
windows-1257 # | index-windows-1257.txt | 33 , 37 |
windows-1258 # | index-windows-1258.txt | - |
x-mac-cyrillic # | index-x-mac-cyrillic.txt | - |
ISO-8859-8 i ISO-8859-8-I to różne nazwy kodowania ponieważ ISO-8859-8 jest podatne na kierunek układu (layoutu). I chociaż historycznie tak samo było w przypadku ISO-8859-6 i "ISO-8859-6-I", to w chwili obecnej nie jest już prawdą.
single-byte decoder#
Algorytm uchwycenia w dekoderze skojarzonym z kodowaniem jednobajtowym pobiera strumień stream i bajt byte, a następnie wykonuje następujące kroki:
- Jeśli byte jest końcem strumienia, to zwróć zakończenie.
- Jeśli byte jest bajtem ASCII, to zwróć punkt kodowy, którego wartością jest byte.
- Niech code point będzie punktem kodowym indeksu dla wyniku obliczenia byte -
0x80
w indeksie jednobajtowym. - Jeśli code point jest wartością
null
, to zwróć błąd. - Zwróć punkt kodowy, którego wartością jest code point.
single-byte encoder#
Algorytm uchwycenia w koderze skojarzonym z kodowaniem jednobajtowym pobiera strumień stream i punkt kodowy code point, a następnie wykonuje następujące kroki:
- Jeśli code point jest końcem strumienia, to zwróć zakończenie.
- Jeśli code point jest punktem kodowym ASCII, to zwróć bajt, którego wartością jest code point.
- Niech pointer będzie wskaźnikiem indeksu dla code point w indeksie jednobajtowym.
- Jeśli pointer jest wartością
null
, to zwróć błąd włącznie z code point. - Zwróć bajt, którego wartością jest wynik obliczenia pointer +
0x80
.
Legacy multi-byte Chinese (simplified) encodings#
GBK#
GBK decoder#
Dekoderem skojarzony z GBK jest dekoder gb18030.
GBK encoder#
Koderem skojarzony z GBK jest koder gb18030 z ustawioną flagą GBK.
Niepełne odwzorowanie GBK przez gb18030 jest konserwatywnym posunięciem, które ma na celu zmniejszenie szansy zepsucia starszych serwerów i innych przetwarzanych zawartości wygenerowanych za pomocą kodera GBK.
gb18030#
gb18030 decoder#
gb18030 first
gb18030 second
gb18030 third
Dekoder skojarzony z gb18030 jest powiązany z pierwszym gb18030 # (gb18030 first), drugim gb18030 # (gb18030 second) i trzecim gb18030 # (gb18030 third) [wszystkie z początkową wartością 0x00
].
Algorytm uchwycenia w dekoderze skojarzonym z gb18030 pobiera strumień stream i bajt byte, a następnie wykonuje następujące kroki:
- Jeśli byte jest końcem strumienia i pierwszy gb18030, drugi gb18030 oraz trzeci gb18030 mają wartość
0x00
, to zwróć zakończenie. - Jeśli byte jest końcem strumienia i pierwszy gb18030, drugi gb18030 oraz trzeci gb18030 nie mają wartości
0x00
, to ustaw pierwszy gb18030, drugi gb18030 oraz trzeci gb18030 na wartość0x00
i zwróć błąd. Jeśli trzeci gb18030 nie jest wartością
0x00
, to wykonaj poniższe podkroki:- Niech code point będzie wartością
null
. - Jeśli byte jest w zakresie
0x30
do0x39
, włącznie, to ustaw code point na punkt kodowy indeksu gb18030 ranges dla wyniku obliczenia (((pierwszy gb18030 -0x81
) *10
+ drugi gb18030 -0x30)
*126
+ trzeci gb18030 -0x81
) *10
+ byte -0x30
. - Niech buffer będzie sekwencją bajtu składającą się z drugiego gb18030, trzeciego gb18030 i byte (zgodnie z kolejnością).
- Ustaw pierwszy gb18030, drugi gb18030 oraz trzeci gb18030 na wartość
0x00
. - Jeśli code point jest wartością
null
, to niech buffer poprzedza stream i zwróć błąd. - Zwróć punkt kodowy, którego wartością jest code point.
- Niech code point będzie wartością
Jeśli drugi gb18030 nie jest wartością
0x00
, to wykonaj poniższe podkroki:- Jeśli byte jest w zakresie
0x81
do0xFE
, włącznie, to ustaw trzeci gb18030 na byte i zwróć kontynuowanie. - Niech drugi gb18030, po którym następuje byte poprzedza stream, ustaw pierwszy gb18030 oraz drugi gb18030 na wartość
0x00
i zwróć błąd.
- Jeśli byte jest w zakresie
Jeśli pierwszy gb18030 nie jest wartością
0x00
, to wykonaj poniższe podkroki:- Jeśli byte jest w zakresie
0x30
do0x39
, włącznie, to ustaw drugi gb18030 na byte i zwróć kontynuowanie. - Niech lead będzie pierwszym gb18030, pointer będzie wartością
null
i ustaw pierwszy gb18030 na wartość0x00
. - Niech offset będzie wartością
0x40
jeśli byte jest mniejszy od0xF7
, w przeciwnym razie0x41
. - Jeśli byte jest w zakresie
0x40
do0x7E
, włącznie, lub0x80
do0xFE
, włącznie, to ustaw pointer na wynik obliczenia (lead -0x81
) *190
+ (byte - offset). - Niech code point będzie wartością
null
jeśli pointer jest wartościąnull
, w przeciwnym razie punktem kodowym indeksu dla pointer w indeksie gb18030. - Jeśli code point jest wartością
null
i byte jest bajtem ASCII, to niech byte poprzedza stream. - Jeśli code point jest wartością
null
, to zwróć błąd. - Zwróć punkt kodowy, którego wartością jest code point.
- Jeśli byte jest w zakresie
- Jeśli byte jest bajtem ASCII, to zwróć punkt kodowy, którego wartością jest byte.
- Jeśli byte jest wartością
0x80
, to zwróć punkt kodowyU+20AC
. - Jeśli byte jest w zakresie
0x81
do0xFE
, włącznie, to ustaw pierwszy gb18030 na byte i zwróć kontynuowanie. - Zwróć błąd.
gb18030 encoder#
flagą GBK
Koder skojarzony z gb18030 jest powiązany z flagą GBK # (GBK flag) [początkowo nieustawioną].
Algorytm uchwycenia w koderze skojarzonym z gb18030 pobiera strumień stream i punkt kodowy code point, a następnie wykonuje następujące kroki:
- Jeśli code point jest końcem strumienia, to zwróć zakończenie.
- Jeśli code point jest punktem kodowym ASCII, to zwróć bajt, którego wartością jest code point.
Jeśli code point jest wartością
U+E5E5
, to zwróć błąd włącznie z code point.Indeks gb18030 mapuje
0xA3 0xA0
naU+3000
zamiast naU+E5E5
dla zachowania kompatybilności z już wdrożonymi treściami. Jednakże nie działa to w dwie strony.- Jeśli flaga GBK jest ustawiona i code point ma wartość
U+20AC
, to zwróć bajt0x80
. - Niech pointer będzie wskaźnikiem indeksu dla code point w indeksie gb18030.
Jeśli pointer nie jest wartością
null
, to wykonaj poniższe podkroki:- Niech lead będzie wynikiem obliczenia floor(pointer /
190
) +0x81
. - Niech trail będzie wynikiem obliczenia pointer %
190
. - Niech offset będzie wartością
0x40
jeśli trail jest mniejszy od wartości0x3F
, w przeciwnym razie wartością0x41
. - Zwróć dwa bajty, których wartościami są lead oraz trail + offset.
- Niech lead będzie wynikiem obliczenia floor(pointer /
- Jeśli flaga GBK jest ustawiona, to zwróć błąd włącznie z code point.
- Ustaw pointer na wskaźnik indeksu gb18030 ranges dla code point.
- Niech byte1 będzie wynikiem obliczenia floor(pointer /
10
/126
/10
). - Ustaw pointer na wynik obliczenia pointer - byte1 *
10
*126
*10
. - Niech byte2 będzie wynikiem obliczenia floor(pointer /
10
/126
). - Ustaw pointer na wynik obliczenia pointer - byte2 *
10
*126
. - Niech byte3 będzie wynikiem obliczenia floor(pointer /
10
). - Niech byte4 będzie wynikiem obliczenia pointer - byte3 *
10
. - Zwróć cztery bajty, których wartościami są byte1 +
0x81
, byte2 +0x30
, byte3 +0x81
oraz byte4 +0x30
.
Legacy multi-byte Chinese (traditional) encodings#
Big5#
Big5 decoder#
Big5 lead
Dekoder skojarzony z Big5 jest powiązany z wiodącym Big5 # (Big5 lead) [z początkową wartością 0x00
].
Algorytm uchwycenia w dekoderze skojarzonym z Big5 pobiera strumień stream i bajt byte, a następnie wykonuje następujące kroki:
- Jeśli byte jest końcem strumienia i wiodący Big5 nie ma wartości
0x00
, to ustaw wiodący Big5 na wartość0x00
i zwróć błąd. - Jeśli byte jest końcem strumienia i wiodący Big5 ma wartość
0x00
, to zwróć zakończenie. Jeśli wiodący Big5 nie jest wartością
0x00
, to niech lead będzie wiodącym Big5, niech pointer będzie wartościąnull
, ustaw wiodący Big5 na wartość0x00
i wykonaj poniższe podkroki:- Niech offset będzie wartością
0x40
jeśli byte jest mniejszy od wartości0x7F
, w przeciwnym razie wartością0x62
. - Jeśli byte jest w zakresie
0x40
do0x7E
, włącznie, lub0xA1
do0xFE
, włącznie, to ustaw pointer na wynik obliczenia (lead -0x81
) *157
+ (byte - offset). Jeśli istnieje wiersz w poniższej tabeli, którego pierwszą kolumną jest pointer, to zwróć dwa punkty kodowe wymienione w jego drugiej kolumnie (trzecia kolumna jest nieistotna).
Wskaźnik Punkty kodowe Uwagi 1133
U+00CA U+0304
Ê̄ (LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND MACRON) 1135
U+00CA U+030C
Ê̌ (LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND CARON) 1164
U+00EA U+0304
ê̄ (LATIN SMALL LETTER E WITH CIRCUMFLEX AND MACRON) 1166
U+00EA U+030C
ê̌ (LATIN SMALL LETTER E WITH CIRCUMFLEX AND CARON) Ponieważ indeksy są ograniczone do pojedynczych punktów kodowych, to powyższa tabela jest stosowana dla tych wskaźników.
- Niech code point będzie wartością
null
jeśli pointer jest wartościąnull
, w przeciwnym razie punktem kodowym indeksu dla pointer w indeksie Big5. - Jeśli code point jest wartością
null
i byte jest bajtem ASCII, to niech byte poprzedza stream. - Jeśli code point jest wartością
null
, to zwróć błąd. - Zwróć punkt kodowy, którego wartością jest code point.
- Niech offset będzie wartością
- Jeśli byte jest bajtem ASCII, to zwróć punkt kodowy, którego wartością jest byte.
- Jeśli byte jest w zakresie
0x81
do0xFE
, włącznie, to ustaw wiodący Big5 na byte i zwróć kontynuowanie. - Zwróć błąd.
Big5 encoder#
Algorytm uchwycenia w koderze skojarzonym z Big5 pobiera strumień stream i punkt kodowy code point, a następnie wykonuje następujące kroki:
- Jeśli code point jest końcem strumienia, to zwróć zakończenie.
- Jeśli code point jest punktem kodowym ASCII, to zwróć bajt, którego wartością jest code point.
- Niech pointer będzie wskaźnikiem indeksu Big5 dla code point.
- Jeśli pointer jest wartością
null
, to zwróć błąd włącznie z code point. - Niech lead będzie wynikiem obliczenia floor(pointer /
157
) +0x81
. - Niech trail będzie wynikiem obliczenia pointer %
157
. - Niech offset będzie wartością
0x40
jeśli trail jest mniejszy od wartości0x3F
, w przeciwnym razie wartością0x62
. - Zwróć dwa bajty, których wartościami są lead i trail + offset.
Legacy multi-byte Japanese encodings#
EUC-JP#
EUC-JP decoder#
EUC-JP jis0212 flag
EUC-JP lead
Dekoder skojarzony z EUC-JP jest powiązany z flagą EUC-JP jis0212 # (EUC-JP jis0212 flag) [początkowo nieustawioną] oraz wiodącym EUC-JP # (EUC-JP lead) [z początkową wartością 0x00
].
Algorytm uchwycenia w dekoderze skojarzonym z EUC-JP pobiera strumień stream i bajt byte, a następnie wykonuje następujące kroki:
- Jeśli byte jest końcem strumienia i wiodący EUC-JP nie ma wartości
0x00
, to ustaw wiodący EUC-JP na wartość0x00
i zwróć błąd. - Jeśli byte jest końcem strumienia i wiodący EUC-JP ma wartość
0x00
, to zwróć zakończenie. - Jeśli wiodący EUC-JP jest wartością
0x8E
i byte jest w zakresie0xA1
do0xDF
, włącznie, to ustaw wiodący EUC-JP na wartość0x00
i zwróć punkt kodowy, którego wartością jest wynik obliczenia0xFF61
+ byte -0xA1
. - Jeśli wiodący EUC-JP jest wartością
0x8F
i byte jest w zakresie0xA1
do0xFE
, włącznie, to ustaw flagę EUC-JP jis0212, ustaw wiodący EUC-JP na byte i zwróć kontynuowanie. Jeśli wiodący EUC-JP nie jest wartością
0x00
, to niech lead będzie wiodącym EUC-JP, ustaw wiodący EUC-JP na wartość0x00
i wykonaj poniższe podkroki:- Niech code point będzie wartością
null
. - Jeśli zarówno lead jak i byte są w zakresie
0xA1
do0xFE
, włącznie, to ustaw code point na punkt kodowy indeksu dla wyniku obliczenia (lead -0xA1
) *94
+ byte -0xA1
w indeksie jis0208 jeśli flaga EUC-JP jis0212 jest nieustawiona, w przeciwnym razie w indeksie jis0212. - Usuń flagę EUC-JP jis0212.
- Jeśli byte nie jest w zakresie
0xA1
do0xFE
, włącznie, to niech byte poprzedza stream. - Jeśli code point jest wartością
null
, to zwróć błąd. - Zwróć punkt kodowy, którego wartością jest code point.
- Niech code point będzie wartością
- Jeśli byte jest bajtem ASCII, to zwróć punkt kodowy, którego wartością jest byte.
- Jeśli byte jest wartością
0x8E
,0x8F
lub w zakresie0xA1
do0xFE
, włącznie, to ustaw wiodący EUC-JP na byte i zwróć kontynuowanie. - Zwróć błąd.
EUC-JP encoder#
Algorytm uchwycenia w koderze skojarzonym z EUC-JP pobiera strumień stream i punkt kodowy code point, a następnie wykonuje następujące kroki:
- Jeśli code point jest końcem strumienia, to zwróć zakończenie.
- Jeśli code point jest punktem kodowym ASCII, to zwróć bajt, którego wartością jest code point.
- Jeśli code point jest wartością
U+00A5
, to zwróć bajt0x5C
. - Jeśli code point jest wartością
U+203E
, to zwróć bajt0x7E
. - Jeśli code point jest w zakresie
U+FF61
doU+FF9F
, włącznie, to zwróć dwa bajty, których wartościami są0x8E
i code point -0xFF61
+0xA1
. - Jeśli code point jest wartością
U+2212
, to ustaw go naU+FF0D
. Niech pointer będzie wskaźnikiem indeksu dla code point w indeksie jis0208.
Indeks jis0212 nie jest używany przez koder EUC-JP ze względu na brak szerokiego wsparcia.
- Jeśli pointer jest wartością
null
, to zwróć błąd włącznie z code point. - Niech lead będzie wynikiem obliczenia floor(pointer /
94
) +0xA1
. - Niech trail będzie wynikiem obliczenia pointer %
94
+0xA1
. - Zwróć dwa bajty, których wartościami są lead i trail.
ISO-2022-JP#
ISO-2022-JP decoder#
ISO-2022-JP decoder state
ISO-2022-JP decoder output state
ISO-2022-JP lead
ISO-2022-JP output flag
Dekoder skojarzony z ISO-2022-JP jest powiązany ze stanem dekodera ISO-2022-JP # (ISO-2022-JP decoder state) [początkowo ASCII], wyjściowym stanem dekodera ISO-2022-JP # (ISO-2022-JP decoder output state) [początkowo ASCII], wiodącym ISO-2022-JP # (ISO-2022-JP lead) [z początkową wartością 0x00
] oraz flagą wyjścia ISO-2022-JP # (ISO-2022-JP output flag) [początkowo nieustawioną].
Algorytm uchwycenia w dekoderze skojarzonym z ISO-2022-JP pobiera strumień stream i bajt byte, a następnie przełączając na stanie dekodera ISO-2022-JP wykonuje następujące kroki:
- ASCII #
W oparciu o wartość byte wykonaj poniższe podkroki:
0x1B
- Ustaw stan dekodera ISO-2022-JP na escape start i zwróć kontynuowanie.
0x00
do0x7F
(z wykluczeniem0x0E
,0x0F
i0x1B
)- Usuń flagę wyjścia ISO-2022-JP i zwróć punkt kodowy, którego wartością jest byte.
- koniec strumienia
- Zwróć zakończenie.
- W przeciwnym razie
- Usuń flagę wyjścia ISO-2022-JP i zwróć błąd.
- Roman #
W oparciu o wartość byte wykonaj poniższe podkroki:
0x1B
- Ustaw stan dekodera ISO-2022-JP na escape start i zwróć kontynuowanie.
0x5C
- Usuń flagę wyjścia ISO-2022-JP i zwróć punkt kodowy
U+00A5
.
- Usuń flagę wyjścia ISO-2022-JP i zwróć punkt kodowy
0x7E
- Usuń flagę wyjścia ISO-2022-JP i zwróć punkt kodowy
U+203E
.
- Usuń flagę wyjścia ISO-2022-JP i zwróć punkt kodowy
0x00
do0x7F
(z wykluczeniem0x0E
,0x0F
,0x1B
,0x5C
i0x7E
)- Usuń flagę wyjścia ISO-2022-JP i zwróć punkt kodowy, którego wartością jest byte.
- koniec strumienia
- Zwróć zakończenie.
- W przeciwnym razie
- Usuń flagę wyjścia ISO-2022-JP i zwróć błąd.
- Katakana #
W oparciu o wartość byte wykonaj poniższe podkroki:
0x1B
- Ustaw stan dekodera ISO-2022-JP na escape start i zwróć kontynuowanie.
0x21
0x5F
- Usuń flagę wyjścia ISO-2022-JP i zwróć punkt kodowy, którego wartością jest wynik obliczenia
0xFF61
+ byte -0x21
.
- Usuń flagę wyjścia ISO-2022-JP i zwróć punkt kodowy, którego wartością jest wynik obliczenia
- koniec strumienia
- Zwróć zakończenie.
- W przeciwnym razie
- Usuń flagę wyjścia ISO-2022-JP i zwróć błąd.
- lead byte #
W oparciu o wartość byte wykonaj poniższe podkroki:
0x1B
- Ustaw stan dekodera ISO-2022-JP na escape start i zwróć kontynuowanie.
0x21
0x7E
- Usuń flagę wyjścia ISO-2022-JP, ustaw wiodący ISO-2022-JP na byte, stan dekodera ISO-2022-JP na trail byte i zwróć kontynuowanie.
- koniec strumienia
- Zwróć zakończenie.
- W przeciwnym razie
- Usuń flagę wyjścia ISO-2022-JP i zwróć błąd.
- trial byte #
W oparciu o wartość byte wykonaj poniższe podkroki:
0x1B
- Ustaw stan dekodera ISO-2022-JP na escape start i zwróć błąd.
0x21
0x7E
- Ustaw stan dekodera ISO-2022-JP na lead byte.
- Niech pointer będzie wynikiem obliczenia (wiodący ISO-2022-JP -
0x21
) *94
+ byte -0x21
. - Niech code point będzie punktem kodowy indeksu dla pointer w indeksie jis0208.
- Jeśli code point jest wartością
null
, to zwróć błąd. - Zwróć punkt kodowy, którego wartością jest code point.
- koniec strumienia
- Ustaw stan dekodera ISO-2022-JP na lead byte, niech byte poprzedza stream i zwróć błąd.
- W przeciwnym razie
- Ustaw stan dekodera ISO-2022-JP na lead byte i zwróć błąd.
- escape start #
- Jeśli byte jest wartością
0x24
lub0x28
, to ustaw wiodący ISO-2022-JP na byte, stan dekodera ISO-2022-JP na escape i zwróć kontynuowanie. - Niech byte poprzedza stream.
- Usuń flagę wyjścia ISO-2022-JP, ustaw stan dekodera ISO-2022-JP na wyjściowy stan dekodera ISO-2022-JP i zwróć błąd.
- Jeśli byte jest wartością
- escape #
- Niech lead będzie wiodącym ISO-2022-JP i ustaw wiodący ISO-2022-JP na wartość
0x00
. - Niech state będzie wartością
null
. - Jeśli lead jest wartością
0x28
i byte jest wartością0x42
, to ustaw state na ASCII. - Jeśli lead jest wartością
0x28
i byte jest wartością0x4A
, to ustaw state na Roman. - Jeśli lead jest wartością
0x28
i byte jest wartością0x49
, to ustaw state na Katakana. - Jeśli lead jest wartością
0x24
i byte jest wartością0x40
lub0x42
, to ustaw state na lead byte. Jeśli state nie jest wartością
null
, to wykonaj poniższe podkroki:- Ustaw stan dekodera ISO-2022-JP i wyjściowy stan dekodera ISO-2022-JP na state.
- Niech output flag będzie flagą wyjścia ISO-2022-JP.
- Ustaw flagę wyjścia ISO-2022-JP.
- Zwróć kontynuowanie jeśli output flag jest nieustawiona, w przeciwnym razie błąd.
- Niech lead i byte poprzedza stream.
- Usuń flagę wyjścia ISO-2022-JP, ustaw stan dekodera ISO-2022-JP na wyjściowy stan dekodera ISO-2022-JP i zwróć błąd.
- Niech lead będzie wiodącym ISO-2022-JP i ustaw wiodący ISO-2022-JP na wartość
ISO-2022-JP encoder#
ISO-2022-JP encoder state
Koder skojarzony z ISO-2022-JP jest powiązany ze stanem kodera ISO-2022-JP # (ISO-2022-JP encoder state), którym może być ASCII #, Roman # i jis0208 # (początkowo ASCII).
Algorytm uchwycenia w koderze skojarzonym z ISO-2022-JP pobiera strumień stream i punkt kodowy code point, a następnie wykonuje następujące kroki:
- Jeśli code point jest końcem strumienia i stanem kodera ISO-2022-JP nie jest ASCII, to niech code point poprzedza stream, ustaw stan kodera ISO-2022-JP na ASCII i zwróć trzy bajty
0x1B 0x28 0x42
. - Jeśli code point jest końcem strumienia i stanem kodera ISO-2022-JP jest ASCII, to zwróć zakończenie.
Jeśli stanem kodera ISO-2022-JP jest ASCII lub Roman i code point jest wartością
U+000E
,U+000F
lubU+001B
, to zwróć błąd włącznie zU+FFFD
.Zwracanie
U+FFFD
zamiast oryginalnego punktu kodowego ma chronić przed atakami.- Jeśli stanem kodera ISO-2022-JP jest ASCII i code point jest punktem kodowym ASCII, to zwróć bajt, którego wartością jest code point.
Jeśli stanem kodera ISO-2022-JP jest Roman i code point jest punktem kodowym ASCII (z wykluczeniem
U+005C
iU+007E
) lub jest wartościąU+00A5
czyU+203E
, to wykonaj poniższe podkroki:- Jeśli code point jest punktem kodowym ASCII, to zwróć bajt, którego wartością jest code point.
- Jeśli code point jest wartością
U+00A5
, to zwróć bajt0x5C
. - Jeśli code point jest wartością
U+203E
, to zwróć bajt0x7E
.
- Jeśli code point jest punktem kodowym ASCII i stanem kodera ISO-2022-JP nie jest ASCII, to niech code point poprzedza stream, ustaw stan kodera ISO-2022-JP na ASCII i zwróć trzy bajty
0x1B 0x28 0x42
. - Jeśli code point jest wartością
U+00A5
lubU+203E
i stanem kodera ISO-2022-JP nie jest Roman, to niech code point poprzedza stream, ustaw stan kodera ISO-2022-JP na Roman i zwróć trzy bajty0x1B 0x28 0x4A
. - Jeśli code point jest wartością
U+2212
, to ustaw go naU+FF0D
. - Niech pointer będzie wskaźnikiem indeksu dla code point w indeksie jis0208.
- Jeśli pointer jest wartością
null
, to zwróć błąd włącznie z code point. - Jeśli stanem kodera ISO-2022-JP nie jest jis0208, to niech code point poprzedza stream, ustaw stan kodera ISO-2022-JP na jis0208 i zwróć trzy bajty
0x1B 0x24 0x42
. - Niech lead będzie wynikiem obliczenia floor(pointer /
94
) +0x21
. - Niech trail będzie wynikiem obliczenia pointer %
94
+0x21
. - Zwróć dwa bajty, których wartościami są lead i trail.
Shift_JIS#
Shift_JIS decoder#
Shift_JIS lead
Dekoder skojarzony z Shift_JIS jest powiązany z wiodącym Shift_JIS # (Shift_JIS lead) [z początkową wartością 0x00
].
Algorytm uchwycenia w dekoderze skojarzonym z Shift_JIS pobiera strumień stream i bajt byte, a następnie wykonuje następujące kroki:
- Jeśli byte jest końcem strumienia i wiodący Shift_JIS nie ma wartości
0x00
, to ustaw wiodący Shift_JIS na wartość0x00
i zwróć błąd. - Jeśli byte jest końcem strumienia i wiodący Shift_JIS ma wartość
0x00
, to zwróć zakończenie. Jeśli wiodący Shift_JIS nie jest wartością
0x00
, to niech lead będzie wiodącym Shift_JIS, niech pointer będzie wartościąnull
, ustaw wiodący Shift_JIS na wartość0x00
i wykonaj poniższe podkroki:- Niech offset będzie wartością
0x40
jeśli byte jest mniejszy od wartości0x7F
, w przeciwnym razie wartością0x41
. - Niech lead offset będzie wartością
0x81
jeśli lead jest mniejszy od wartości0xA0
, w przeciwnym razie wartością0xC1
. - Jeśli byte jest w zakresie
0x40
do0x7E
, włącznie, lub0x80
do0xFC
, włącznie, to ustaw pointer na wynik obliczenia (lead - lead offset) *188
+ byte - offset. - Niech code point będzie wartością
null
jeśli pointer jest wartościąnull
, w przeciwnym razie punktem kodowym indeksu dla pointer w indeksie jis0208. Jeśli code point jest wartością
null
i pointer jest w zakresie8836
do10528
, włącznie, to zwróć punkt kodowy, którego wartością jest wynik obliczenia0xE000
+ pointer -8836
.Jest to interoperacyjne dziedzictwo z Windowsa znane jako EUDC.
- Jeśli code point jest wartością
null
i byte jest bajtem ASCII, to niech byte poprzedza stream. - Jeśli code point jest wartością
null
, to zwróć błąd. - Zwróć punkt kodowy, którego wartością jest code point.
- Niech offset będzie wartością
- Jeśli byte jest bajtem ASCII lub wartością
0x80
, to zwróć punkt kodowy, którego wartością jest byte. - Jeśli byte jest w zakresie
0xA1
do0xDF
, włącznie, to zwróć punkt kodowy, którego wartością jest wynik obliczenia0xFF61
+ byte -0xA1
. - Jeśli byte jest w zakresie
0x81
do0x9F
, włącznie, lub0xE0
do0xFC
, włącznie, to ustaw wiodący Shift_JIS na byte i zwróć kontynuowanie. - Zwróć błąd.
Shift_JIS encoder#
Algorytm uchwycenia w koderze skojarzonym z Shift_JIS pobiera strumień stream i punkt kodowy code point, a następnie wykonuje następujące kroki:
- Jeśli code point jest końcem strumienia, to zwróć zakończenie.
- Jeśli code point jest punktem kodowym ASCII lub wartością
U+0080
, to zwróć bajt, którego wartością jest code point. - Jeśli code point jest wartością
U+00A5
, to zwróć bajt0x5C
. - Jeśli code point jest wartością
U+203E
, to zwróć bajt0x7E
. - Jeśli code point jest w zakresie
U+FF61
doU+FF9F
, włącznie, to zwróć bajt, którego wartością jest wynik obliczenia code point -0xFF61
+0xA1
. - Jeśli code point jest wartością
U+2212
, to ustaw go naU+FF0D
. - Niech pointer będzie wskaźnikiem indeksu Shift_JIS dla code point.
- Jeśli pointer jest wartością
null
, to zwróć błąd włącznie z code point. - Niech lead będzie wynikiem obliczenia floor(pointer /
188
). - Niech lead offset będzie wartością
0x81
jeśli lead jest mniejszy od wartości0x1F
, w przeciwnym razie wartością0xC1
. - Niech trail będzie wynikiem obliczenia pointer %
188
. - Niech offset będzie wartością
0x40
jeśli trail jest mniejszy od wartości0x3F
, w przeciwnym razie wartością0x41
. - Zwróć dwa bajty, których wartościami są lead + lead offset i trail + offset.
Legacy multi-byte Korean encodings#
EUC-KR#
EUC-KR decoder#
EUC-KR lead
Dekoder skojarzony z EUC-KR jest powiązany z wiodącym EUC-KR # (EUC-KR lead) [z początkową wartością 0x00
].
Algorytm uchwycenia w dekoderze skojarzonym z EUC-KR pobiera strumień stream i bajt byte, a następnie wykonuje następujące kroki:
- Jeśli byte jest końcem strumienia i wiodący EUC-KR nie ma wartości
0x00
, to ustaw wiodący EUC-KR na wartość0x00
i zwróć błąd. - Jeśli byte jest końcem strumienia i wiodący EUC-KR ma wartość
0x00
, to zwróć zakończenie. Jeśli wiodący EUC-KR nie jest wartością
0x00
, to niech lead będzie wiodącym EUC-KR, niech pointer będzie wartościąnull
, ustaw wiodący EUC-KR na wartość0x00
i wykonaj poniższe podkroki:- Jeśli byte jest w zakresie
0x41
do0xFE
, włącznie, to ustaw pointer na wynik obliczenia (lead −0x81
) *190
+ (byte −0x41
). - Niech code point będzie wartością
null
jeśli pointer jest wartościąnull
, w przeciwnym razie punktem kodowym indeksu dla pointer w indeksie EUC-KR. - Jeśli code point jest wartością
null
i byte jest bajtem ASCII, to niech byte poprzedza stream. - Jeśli code point jest wartością
null
, to zwróć błąd. - Zwróć punkt kodowy, którego wartością jest code point.
- Jeśli byte jest w zakresie
- Jeśli byte jest bajtem ASCII, to zwróć punkt kodowy, którego wartością jest byte.
- Jeśli byte jest w zakresie
0x81
do0xFE
, włącznie, to ustaw wiodący EUC-KR na byte i zwróć kontynuowanie. - Zwróć błąd.
EUC-KR encoder#
Algorytm uchwycenia w koderze skojarzonym z EUC-KR pobiera strumień stream i punkt kodowy code point, a następnie wykonuje następujące kroki:
- Jeśli code point jest końcem strumienia, to zwróć zakończenie.
- Jeśli code point jest punktem kodowym ASCII, to zwróć bajt, którego wartością jest code point.
- Niech pointer będzie wskaźnikiem indeksu dla code point w indeksie EUC-KR.
- Jeśli pointer jest wartością
null
, to zwróć błąd włącznie z code point. - Niech lead będzie wynikiem obliczenia floor(pointer /
190
) +0x81
. - Niech trail będzie wynikiem obliczenia pointer %
190
+0x41
. - Zwróć dwa bajty, których wartościami są lead i trail.
Legacy miscellaneous encodings#
replacement#
Kodowanie replacement utworzono w celu zapobieganiu atakom, które wykorzystują niedopasowanie pomiędzy kodowaniami obsługiwanymi na serwerze i kliencie.
replacement decoder#
replacement error returned flag
Dekoder skojarzony z replacement jest powiązany z flagą zwrócenia błędu replacement # (replacement error returned flag) [początkowo nieustawioną].
Algorytm uchwycenia w dekoderze skojarzonym z replacement pobiera strumień stream i bajt byte, a następnie wykonuje następujące kroki:
- Jeśli byte jest końcem strumienia, to zwróć zakończenie.
- Jeśli flaga zwrócenia błędu replacement jest nieustawiona, to ustaw flagę zwrócenia błędu replacement i zwróć błąd.
- Zwróć zakończenie.
Common infrastructure for UTF-16BE and UTF-16LE#
shared UTF-16 decoder#
Znacznik BOM ma większy priorytet niż etykieta, co okazuje się być bardziej prawidłowe z już wdrożonymi treściami. W związku z tym nie jest on częścią algorytmu dekodera shared utf-16, lecz algorytmu dekodowania.
UTF-16 lead byte
UTF-16 lead surrogate
UTF-16BE decoder flag
Dekoder shared UTF-16 jest powiązany z wiodącym bajtem UTF-16 # (UTF-16 lead byte) i wiodącym surogatem UTF-16 # (UTF-16 lead surrogate) [obydwa z początkową wartością null
] oraz flagą dekodera UTF-16BE # (UTF-16BE decoder flag) [początkowo nieustawioną].
Algorytm uchwycenia w dekoderze shared UTF-16 pobiera strumień stream i bajt byte, a następnie wykonuje następujące kroki:
- Jeśli byte jest końcem strumienia i wiodący bajt UTF-16 lub wiodący surogat UTF-16 nie jest wartością
null
, to ustaw wiodący bajt UTF-16 i wiodący surogat UTF-16 na wartośćnull
i zwróć błąd. - Jeśli byte jest końcem strumienia i wiodący bajt UTF-16 oraz wiodący surogat UTF-16 są wartością
null
, to zwróć zakończenie. - Jeśli wiodący bajt UTF-16 jest wartością
null
, to ustaw wiodący bajt UTF-16 na byte i zwróć kontynuowanie. Niech w oparciu o stan flagi dekodera UTF-16BE code unit będzie wynikiem obliczenia:
- flaga dekodera UTF-16BE jest ustawiona
- (wiodący bajt UTF-16 <<
8
) + byte - flaga dekodera UTF-16BE jest nieustawiona
- (byte <<
8
) + wiodący bajt UTF-16
Następnie ustaw wiodący bajt UTF-16 na wartość
null
.Jeśli wiodący surogat UTF-16 nie jest wartością
null
, to niech lead surrogate będzie wiodącym surogatem UTF-16, ustaw wiodący surogat UTF-16 na wartośćnull
i wykonaj poniższe podkroki:- Jeśli code unit jest w zakresie
U+DC00
doU+DFFF
, włącznie, to zwróć punkt kodowy, którego wartością jest wynik obliczenia0x10000
+ ((lead surrogate -0xD800
) <<10
) + (code unit -0xDC00
). Niech bytes będą zwracaną wartością otrzymaną z wykonania poniższych wewnętrznych podkroków:
- Niech byte1 będzie wynikiem obliczenia code unit >>
8
. - Niech byte2 będzie wynikiem obliczenia code unit &
0x00FF
. Następnie, w oparciu o stan flagi dekodera UTF-16BE, zwróć bajty (zgodnie z kolejnością):
- flaga dekodera UTF-16BE jest ustawiona
- byte1 byte2
- flaga dekodera UTF-16BE jest nieustawiona
- byte2 byte1
- Niech byte1 będzie wynikiem obliczenia code unit >>
- Niech bytes poprzedza stream i zwróć błąd.
- Jeśli code unit jest w zakresie
- Jeśli code unit jest w zakresie
U+D800
doU+DBFF
, włącznie, to ustaw wiodący surogat UTF-16 na code unit i zwróć kontynuowanie. - Jeśli code unit jest w zakresie
U+DC00
doU+DFFF
, włącznie, to zwróć błąd. - Zwróć punkt kodowy code unit.
UTF-16BE#
UTF-16BE decoder#
Dekoderem skojarzonym z UTF-16BE jest shared UTF-16 decoder z ustawioną flagą dekodera UTF-16BE.
UTF-16LE#
Zarówno "utf-16
" jak i "utf-16le
" są etykietami dla UTF-16LE zgodnie z już wdrożonymi treściami.
UTF-16LE decoder#
Dekoderem skojarzonym z UTF-16LE jest shared UTF-16 decoder.
x-user-defined#
Chociaż technicznie jest to kodowanie jednobajtowe, to zdefiniowano je osobno ze względu na możliwość algorytmicznej implementacji.
x-user-defined decoder#
Algorytm uchwycenia w dekoderze skojarzonym z x-user-defined pobiera strumień stream i bajt byte, a następnie wykonuje następujące kroki:
- Jeśli byte jest końcem strumienia, to zwróć zakończenie.
- Jeśli byte jest bajtem ASCII, to zwróć punkt kodowy, którego wartością jest byte.
- Zwróć punkt kodowy, którego wartością jest wynik obliczenia
0xF780
+ byte -0x80
.
x-user-defined encoder#
Algorytm uchwycenia w koderze skojarzonym z x-user-defined pobiera strumień stream i punkt kodowy code point, a następnie wykonuje następujące kroki:
- Jeśli code point jest końcem strumienia, to zwróć zakończenie.
- Jeśli code point jest punktem kodowym ASCII, to zwróć bajt, którego wartością jest code point.
- Jeśli code point jest w zakresie
U+F780
doU+F7FF
, włącznie, to zwróć bajt, którego wartością jest wynik obliczenia code point -0xF780
+0x80
. - Zwróć błąd włącznie z code point.
Browser UI#
Przeglądarki są zachęcane do nie udostępniania możliwości nadpisywania kodowania dla zasobu. Jeśli taka funkcja jest jednak obecna, to ze względu na wyżej wymienione błędy bezpieczeństwa przeglądarki nie powinny oferować kodowań UTF-16BE oraz UTF-16LE. Przeglądarki powinny także wyłączyć tę funkcję jeśli zasób został zdekodowany przy użyciu UTF-16BE lub UTF-16LE.