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 &#128169; zwróci strumień "&#128169; 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:

  1. Jeśli mode nie został przekazany, to ustaw go na "replacement" jeśli encoderDecoder jest dekoderem, w przeciwnym razie na "fatal".
  2. Niech encoderDecoderInstance będzie nowym encoderDecoder.
  3. Dopóki (while) prawda:

    1. Niech result będzie wynikiem przetwarzania z przekazaniem rezultatu odczytania z input dla encoderDecoderInstance, input, output i mode.
    2. Jeśli result nie jest kontynuowaniem, to zwróć result.
    3. 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:

  1. Jeśli mode nie został przekazany, to ustaw go na "replacement" jeśli encoderDecoderInstance jest instancją dekodera, w przeciwnym razie na "fatal".
  2. Niech result będzie wynikiem uruchomienia algorytmu uchwycenia skojarzonego z encoderDecoderInstance na input i token.
  3. Jeśli result jest kontynuowaniem lub zakończeniem, to zwróć result.
  4. W przeciwnym razie, jeśli result jest jednym lub większą liczbą słów, to niech result następuje po output.
  5. W przeciwnym razie, jeśli result jest błędem to, w zależności od mode, wykonaj poniższe podkroki:

    "replacement"
    1. Niech U+FFFD następuje po output.
    "html"
    1. 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ępuje U+003B (;) poprzedza input.
    "fatal"
    1. Zwróć błąd.
  6. 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:

  1. Usuń wszystkie początkowe i końcowe białe znaki ASCII z label.
  2. 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.

NazwaEtykieta
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:

  1. Jeśli encoding wskazuje na replacement, UTF-16BE lub UTF-16LE, to zwróć UTF-8.
  2. 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ę.

IndeksUwagi
indeks Big5 #index-big5.txtTo pasuje do standardu Big5 w kombinacji z Hong Kong Supplementary Character Set i innymi popularnymi rozszerzeniami.
indeks EUC-KR #index-euc-kr.txtTo pasuje do standardu KS X 1001 i Unified Hangul Code, znanych wspólnie jako Windows Codepage 949.
indeks gb18030 #index-gb18030.txtTo 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.txtIndeks 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.txtTo jest standard JIS X 0208 z uwzględnieniem wcześniejszych rozszerzeń od IBM i NEC.
indeks jis0212 #index-jis0212.txtTo 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:

  1. Jeśli pointer jest większy od 39419 i mniejszy od 189000, lub pointer jest większy od 1237575, to zwróć wartość null.
  2. Jeśli pointer jest wartością 7457, to zwróć punkt kodowy U+E7C7.
  3. 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.
  4. 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:

  1. Jeśli code point jest wartością U+E7C7, to zwróć wskaźnik 7457.
  2. 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.
  3. 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:

  1. Niech index będzie indeksem jis0208 z wykluczeniem wszystkich wskaźników w zakresie 8272 do 8835 włącznie.
  2. 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:

  1. 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.

  2. Jeśli code point ma wartość U+2550, U+255E, U+2561, U+256A, U+5341 lub U+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.

  3. 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:

  1. Niech buffer będzie pustą sekwencją bajtów.
  2. Niech BOM seen flag będzie nieustawiona.
  3. Odczytuj bajty ze stream do buffer dopóki buffer zawiera trzy bajty lub odczyt zwraca koniec strumienia.
  4. 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 0xBFUTF-8
    0xFE 0xFFUTF-16BE
    0xFF 0xFEUTF-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`.

  5. Jeśli BOM seen flag jest nieustawiona, to niech buffer poprzedza stream.
  6. 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.
  7. Niech output będzie strumieniem punktów kodowych.
  8. Uruchom skojarzony z encoding dekoder przekazując stream i output.
  9. Zwróć output.

UTF-8 decode

Aby zdekodować w UTF-8 # (UTF-8 decode) strumień bajtów stream należy wykonać następujące kroki:

  1. Niech buffer będzie pustą sekwencją bajtów.
  2. Odczytaj trzy bajty ze stream do buffer.
  3. Jeśli buffer nie pasuje do 0xEF 0xBB 0xBF, to niech buffer poprzedza stream.
  4. Niech output będzie strumieniem punktów kodowych.
  5. Uruchom skojarzony z UTF-8 dekoder przekazując stream i output.
  6. 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:

  1. Niech output będzie strumieniem punktów kodowych.
  2. Uruchom skojarzony z UTF-8 dekoder przekazując stream i output.
  3. 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:

  1. Niech output będzie strumieniem punktów kodowych.
  2. Niech potentialError będzie wynikiem uruchomienia skojarzonego z UTF-8 dekoder przekazując stream, output i "fatal".
  3. Jeśli potentialError jest błędem, to zwróć niepowodzenie.
  4. Zwróć output.

encode

Aby zakodować # (encode) strumień punktów kodowych stream z użyciem kodowania encoding należy wykonać następujące kroki:

  1. Aseracji: encoding nie wskazuje na replacement, UTF-16BE lub UTF-16LE.
  2. Niech output będzie strumieniem bajtów.
  3. Uruchom skojarzony z encoding koder przekazując stream, output i "html".
  4. 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:

  1. Jeśli byte jest końcem strumienia i potrzebne bajty UTF-8 nie są 0, to ustaw potrzebne bajty UTF-8 na 0 i zwróć błąd.
  2. Jeśli byte jest końcem strumienia, to zwróć zakończenie.
  3. Jeśli potrzebne bajty UTF-80 to, w zależności od byte, wykonaj poniższe podkroki:

    0x00 do 0x7F
    1. Zwróć punkt kodowy, którego wartością jest byte.
    0xC2 do 0xDF
    1. Ustaw potrzebne bajty UTF-8 na 1.
    2. Ustaw punkt kodowy UTF-8 na wynik obliczenia byte & 0x1F.

      Pięć najmniej znaczących bitów w bajcie.

    3. Zwróć kontynuowanie.
    0xE0 do 0xEF
    1. Jeśli byte ma wartość 0xE0, to ustaw dolną granicę UTF-8 na 0xA0.
    2. Jeśli byte ma wartość 0xED, to ustaw górną granicę UTF-8 na 0x9F.
    3. Ustaw potrzebne bajty UTF-8 na 2.
    4. Ustaw punkt kodowy UTF-8 na wynik obliczenia byte & 0xF.

      Cztery najmniej znaczące bity w bajcie.

    0xF0 do 0xF4
    1. Jeśli byte ma wartość 0xF0, to ustaw dolną granicę UTF-8 na 0x90.
    2. Jeśli byte ma wartość 0xF4, to ustaw górną granicę UTF-8 na 0x8F.
    3. Ustaw potrzebne bajty UTF-8 na 3.
    4. Ustaw punkt kodowy UTF-8 na wynik obliczenia byte & 0x7.

      Trzy najmniej znaczące bity w bajcie.

    W przeciwnym razie
    1. Zwróć błąd.

    Zwróć kontynuowanie.

  4. Jeśli byte nie jest w zakresie dolna granica UTF-8 do górna granica UTF-8, włącznie, to wykonaj poniższe podkroki:

    1. Ustaw punkt kodowy UTF-8, potrzebne bajty UTF-8 i widziane bajty UTF-8 na 0, ustaw dolną granicę UTF-8 na 0x80 i górną granicę UTF-8 na 0xBF.
    2. Niech byte poprzedza stream.
    3. Zwróć błąd.
  5. Ustaw dolną granicę UTF-8 na 0x80 i górną granicę UTF-8 na 0xBF.
  6. 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.

  7. Zwiększ widziane bajty UTF-8 o jeden.
  8. Jeśli widziane bajty UTF-8 nie są równe potrzebnym bajtom UTF-8, to zwróć kontynuowanie.
  9. Niech code point będzie punktem kodowym UTF-8.
  10. Ustaw punkt kodowy UTF-8, potrzebne bajty UTF-8 i widziane bajty UTF-8 na 0.
  11. 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:

  1. Jeśli code point jest końcem strumienia, to zwróć zakończenie.
  2. Jeśli code point jest punktem kodowym ASCII, to zwróć bajt, którego wartością jest code point.
  3. Ustaw count i offset w zależności od zakresu, w którym znajduje się code point:

    U+0080 do U+07FF włącznie
    count na 1 i offset na 0xC0.
    U+0800 do U+FFFF włącznie
    count na 2 i offset na 0xE0.
    U+10000 do U+10FFFF włącznie
    count na 3 i offset na 0xF0.
  4. Niech bytes będzie sekwencją bajtów, której pierwszy bajt to wynik obliczenia (code point >> (6 * count)) + offset.
  5. Dopóki (while) count jest większy od 0, to wykonaj poniższe podkroki:

    1. Ustaw temp na wynik obliczenia code point >> (6 * count - 1)).
    2. Dodaj do bytes wynik obliczenia 0x80 | (temp & 0x3F).
    3. Zmniejsz count o jeden.
  6. 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.

NazwaIndeksBrakujące wskaźniki
IBM866 #index-ibm866.txt-
ISO-8859-2 #index-iso-8859-2.txt-
ISO-8859-3 #index-iso-8859-3.txt37, 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.txt33, 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.txt46, 82, 127
ISO-8859-8 #index-iso-8859-8.txt33, 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.txt91, 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.txt42, 82, 127
windows-1254 #index-windows-1254.txt-
windows-1255 #index-windows-1255.txt74, 89, 90, 91, 92, 93, 94, 95, 124, 127
windows-1256 #index-windows-1256.txt-
windows-1257 #index-windows-1257.txt33, 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:

  1. Jeśli byte jest końcem strumienia, to zwróć zakończenie.
  2. Jeśli byte jest bajtem ASCII, to zwróć punkt kodowy, którego wartością jest byte.
  3. Niech code point będzie punktem kodowym indeksu dla wyniku obliczenia byte - 0x80 w indeksie jednobajtowym.
  4. Jeśli code point jest wartością null, to zwróć błąd.
  5. 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:

  1. Jeśli code point jest końcem strumienia, to zwróć zakończenie.
  2. Jeśli code point jest punktem kodowym ASCII, to zwróć bajt, którego wartością jest code point.
  3. Niech pointer będzie wskaźnikiem indeksu dla code point w indeksie jednobajtowym.
  4. Jeśli pointer jest wartością null, to zwróć błąd włącznie z code point.
  5. 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:

  1. Jeśli byte jest końcem strumienia i pierwszy gb18030, drugi gb18030 oraz trzeci gb18030 mają wartość 0x00, to zwróć zakończenie.
  2. 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.
  3. Jeśli trzeci gb18030 nie jest wartością 0x00, to wykonaj poniższe podkroki:

    1. Niech code point będzie wartością null.
    2. Jeśli byte jest w zakresie 0x30 do 0x39, 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.
    3. Niech buffer będzie sekwencją bajtu składającą się z drugiego gb18030, trzeciego gb18030 i byte (zgodnie z kolejnością).
    4. Ustaw pierwszy gb18030, drugi gb18030 oraz trzeci gb18030 na wartość 0x00.
    5. Jeśli code point jest wartością null, to niech buffer poprzedza stream i zwróć błąd.
    6. Zwróć punkt kodowy, którego wartością jest code point.
  4. Jeśli drugi gb18030 nie jest wartością 0x00, to wykonaj poniższe podkroki:

    1. Jeśli byte jest w zakresie 0x81 do 0xFE, włącznie, to ustaw trzeci gb18030 na byte i zwróć kontynuowanie.
    2. Niech drugi gb18030, po którym następuje byte poprzedza stream, ustaw pierwszy gb18030 oraz drugi gb18030 na wartość 0x00 i zwróć błąd.
  5. Jeśli pierwszy gb18030 nie jest wartością 0x00, to wykonaj poniższe podkroki:

    1. Jeśli byte jest w zakresie 0x30 do 0x39, włącznie, to ustaw drugi gb18030 na byte i zwróć kontynuowanie.
    2. Niech lead będzie pierwszym gb18030, pointer będzie wartością null i ustaw pierwszy gb18030 na wartość 0x00.
    3. Niech offset będzie wartością 0x40 jeśli byte jest mniejszy od 0xF7, w przeciwnym razie 0x41.
    4. Jeśli byte jest w zakresie 0x40 do 0x7E, włącznie, lub 0x80 do 0xFE, włącznie, to ustaw pointer na wynik obliczenia (lead - 0x81) * 190 + (byte - offset).
    5. 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.
    6. Jeśli code point jest wartością null i byte jest bajtem ASCII, to niech byte poprzedza stream.
    7. Jeśli code point jest wartością null, to zwróć błąd.
    8. Zwróć punkt kodowy, którego wartością jest code point.
  6. Jeśli byte jest bajtem ASCII, to zwróć punkt kodowy, którego wartością jest byte.
  7. Jeśli byte jest wartością 0x80, to zwróć punkt kodowy U+20AC.
  8. Jeśli byte jest w zakresie 0x81 do 0xFE, włącznie, to ustaw pierwszy gb18030 na byte i zwróć kontynuowanie.
  9. 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:

  1. Jeśli code point jest końcem strumienia, to zwróć zakończenie.
  2. Jeśli code point jest punktem kodowym ASCII, to zwróć bajt, którego wartością jest code point.
  3. Jeśli code point jest wartością U+E5E5, to zwróć błąd włącznie z code point.

    Indeks gb18030 mapuje 0xA3 0xA0 na U+3000 zamiast na U+E5E5 dla zachowania kompatybilności z już wdrożonymi treściami. Jednakże nie działa to w dwie strony.

  4. Jeśli flaga GBK jest ustawiona i code point ma wartość U+20AC, to zwróć bajt 0x80.
  5. Niech pointer będzie wskaźnikiem indeksu dla code point w indeksie gb18030.
  6. Jeśli pointer nie jest wartością null, to wykonaj poniższe podkroki:

    1. Niech lead będzie wynikiem obliczenia floor(pointer / 190) + 0x81.
    2. Niech trail będzie wynikiem obliczenia pointer % 190.
    3. Niech offset będzie wartością 0x40 jeśli trail jest mniejszy od wartości 0x3F, w przeciwnym razie wartością 0x41.
    4. Zwróć dwa bajty, których wartościami są lead oraz trail + offset.
  7. Jeśli flaga GBK jest ustawiona, to zwróć błąd włącznie z code point.
  8. Ustaw pointer na wskaźnik indeksu gb18030 ranges dla code point.
  9. Niech byte1 będzie wynikiem obliczenia floor(pointer / 10 / 126 / 10).
  10. Ustaw pointer na wynik obliczenia pointer - byte1 * 10 * 126 * 10.
  11. Niech byte2 będzie wynikiem obliczenia floor(pointer / 10 / 126).
  12. Ustaw pointer na wynik obliczenia pointer - byte2 * 10 * 126.
  13. Niech byte3 będzie wynikiem obliczenia floor(pointer / 10).
  14. Niech byte4 będzie wynikiem obliczenia pointer - byte3 * 10.
  15. 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:

  1. 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.
  2. Jeśli byte jest końcem strumienia i wiodący Big5 ma wartość 0x00, to zwróć zakończenie.
  3. 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:

    1. Niech offset będzie wartością 0x40 jeśli byte jest mniejszy od wartości 0x7F, w przeciwnym razie wartością 0x62.
    2. Jeśli byte jest w zakresie 0x40 do 0x7E, włącznie, lub 0xA1 do 0xFE, włącznie, to ustaw pointer na wynik obliczenia (lead - 0x81) * 157 + (byte - offset).
    3. 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źnikPunkty kodoweUwagi
      1133U+00CA U+0304Ê̄ (LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND MACRON)
      1135U+00CA U+030CÊ̌ (LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND CARON)
      1164U+00EA U+0304ê̄ (LATIN SMALL LETTER E WITH CIRCUMFLEX AND MACRON)
      1166U+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.

    4. 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.
    5. Jeśli code point jest wartością null i byte jest bajtem ASCII, to niech byte poprzedza stream.
    6. Jeśli code point jest wartością null, to zwróć błąd.
    7. Zwróć punkt kodowy, którego wartością jest code point.
  4. Jeśli byte jest bajtem ASCII, to zwróć punkt kodowy, którego wartością jest byte.
  5. Jeśli byte jest w zakresie 0x81 do 0xFE, włącznie, to ustaw wiodący Big5 na byte i zwróć kontynuowanie.
  6. 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:

  1. Jeśli code point jest końcem strumienia, to zwróć zakończenie.
  2. Jeśli code point jest punktem kodowym ASCII, to zwróć bajt, którego wartością jest code point.
  3. Niech pointer będzie wskaźnikiem indeksu Big5 dla code point.
  4. Jeśli pointer jest wartością null, to zwróć błąd włącznie z code point.
  5. Niech lead będzie wynikiem obliczenia floor(pointer / 157) + 0x81.
  6. Niech trail będzie wynikiem obliczenia pointer % 157.
  7. Niech offset będzie wartością 0x40 jeśli trail jest mniejszy od wartości 0x3F, w przeciwnym razie wartością 0x62.
  8. 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:

  1. 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.
  2. Jeśli byte jest końcem strumienia i wiodący EUC-JP ma wartość 0x00, to zwróć zakończenie.
  3. Jeśli wiodący EUC-JP jest wartością 0x8E i byte jest w zakresie 0xA1 do 0xDF, włącznie, to ustaw wiodący EUC-JP na wartość 0x00 i zwróć punkt kodowy, którego wartością jest wynik obliczenia 0xFF61 + byte - 0xA1.
  4. Jeśli wiodący EUC-JP jest wartością 0x8F i byte jest w zakresie 0xA1 do 0xFE, włącznie, to ustaw flagę EUC-JP jis0212, ustaw wiodący EUC-JP na byte i zwróć kontynuowanie.
  5. 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:

    1. Niech code point będzie wartością null.
    2. Jeśli zarówno lead jak i byte są w zakresie 0xA1 do 0xFE, 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.
    3. Usuń flagę EUC-JP jis0212.
    4. Jeśli byte nie jest w zakresie 0xA1 do 0xFE, włącznie, to niech byte poprzedza stream.
    5. Jeśli code point jest wartością null, to zwróć błąd.
    6. Zwróć punkt kodowy, którego wartością jest code point.
  6. Jeśli byte jest bajtem ASCII, to zwróć punkt kodowy, którego wartością jest byte.
  7. Jeśli byte jest wartością 0x8E, 0x8F lub w zakresie 0xA1 do 0xFE, włącznie, to ustaw wiodący EUC-JP na byte i zwróć kontynuowanie.
  8. 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:

  1. Jeśli code point jest końcem strumienia, to zwróć zakończenie.
  2. Jeśli code point jest punktem kodowym ASCII, to zwróć bajt, którego wartością jest code point.
  3. Jeśli code point jest wartością U+00A5, to zwróć bajt 0x5C.
  4. Jeśli code point jest wartością U+203E, to zwróć bajt 0x7E.
  5. Jeśli code point jest w zakresie U+FF61 do U+FF9F, włącznie, to zwróć dwa bajty, których wartościami są 0x8E i code point - 0xFF61 + 0xA1.
  6. Jeśli code point jest wartością U+2212, to ustaw go na U+FF0D.
  7. 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.

  8. Jeśli pointer jest wartością null, to zwróć błąd włącznie z code point.
  9. Niech lead będzie wynikiem obliczenia floor(pointer / 94) + 0xA1.
  10. Niech trail będzie wynikiem obliczenia pointer % 94 + 0xA1.
  11. 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
  1. Ustaw stan dekodera ISO-2022-JP na escape start i zwróć kontynuowanie.
0x00 do 0x7F (z wykluczeniem 0x0E, 0x0F i 0x1B)
  1. Usuń flagę wyjścia ISO-2022-JP i zwróć punkt kodowy, którego wartością jest byte.
koniec strumienia
  1. Zwróć zakończenie.
W przeciwnym razie
  1. Usuń flagę wyjścia ISO-2022-JP i zwróć błąd.
Roman #

W oparciu o wartość byte wykonaj poniższe podkroki:

0x1B
  1. Ustaw stan dekodera ISO-2022-JP na escape start i zwróć kontynuowanie.
0x5C
  1. Usuń flagę wyjścia ISO-2022-JP i zwróć punkt kodowy U+00A5.
0x7E
  1. Usuń flagę wyjścia ISO-2022-JP i zwróć punkt kodowy U+203E.
0x00 do 0x7F (z wykluczeniem 0x0E, 0x0F, 0x1B, 0x5C i 0x7E)
  1. Usuń flagę wyjścia ISO-2022-JP i zwróć punkt kodowy, którego wartością jest byte.
koniec strumienia
  1. Zwróć zakończenie.
W przeciwnym razie
  1. Usuń flagę wyjścia ISO-2022-JP i zwróć błąd.
Katakana #

W oparciu o wartość byte wykonaj poniższe podkroki:

0x1B
  1. Ustaw stan dekodera ISO-2022-JP na escape start i zwróć kontynuowanie.
0x21 0x5F
  1. Usuń flagę wyjścia ISO-2022-JP i zwróć punkt kodowy, którego wartością jest wynik obliczenia 0xFF61 + byte - 0x21.
koniec strumienia
  1. Zwróć zakończenie.
W przeciwnym razie
  1. Usuń flagę wyjścia ISO-2022-JP i zwróć błąd.
lead byte #

W oparciu o wartość byte wykonaj poniższe podkroki:

0x1B
  1. Ustaw stan dekodera ISO-2022-JP na escape start i zwróć kontynuowanie.
0x21 0x7E
  1. 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
  1. Zwróć zakończenie.
W przeciwnym razie
  1. Usuń flagę wyjścia ISO-2022-JP i zwróć błąd.
trial byte #

W oparciu o wartość byte wykonaj poniższe podkroki:

0x1B
  1. Ustaw stan dekodera ISO-2022-JP na escape start i zwróć błąd.
0x21 0x7E
  1. Ustaw stan dekodera ISO-2022-JP na lead byte.
  2. Niech pointer będzie wynikiem obliczenia (wiodący ISO-2022-JP - 0x21) * 94 + byte - 0x21.
  3. Niech code point będzie punktem kodowy indeksu dla pointer w indeksie jis0208.
  4. Jeśli code point jest wartością null, to zwróć błąd.
  5. Zwróć punkt kodowy, którego wartością jest code point.
koniec strumienia
  1. Ustaw stan dekodera ISO-2022-JP na lead byte, niech byte poprzedza stream i zwróć błąd.
W przeciwnym razie
  1. Ustaw stan dekodera ISO-2022-JP na lead byte i zwróć błąd.
escape start #
  1. Jeśli byte jest wartością 0x24 lub 0x28, to ustaw wiodący ISO-2022-JP na byte, stan dekodera ISO-2022-JP na escape i zwróć kontynuowanie.
  2. Niech byte poprzedza stream.
  3. 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.
escape #
  1. Niech lead będzie wiodącym ISO-2022-JP i ustaw wiodący ISO-2022-JP na wartość 0x00.
  2. Niech state będzie wartością null.
  3. Jeśli lead jest wartością 0x28 i byte jest wartością 0x42, to ustaw state na ASCII.
  4. Jeśli lead jest wartością 0x28 i byte jest wartością 0x4A, to ustaw state na Roman.
  5. Jeśli lead jest wartością 0x28 i byte jest wartością 0x49, to ustaw state na Katakana.
  6. Jeśli lead jest wartością 0x24 i byte jest wartością 0x40 lub 0x42, to ustaw state na lead byte.
  7. Jeśli state nie jest wartością null, to wykonaj poniższe podkroki:

    1. Ustaw stan dekodera ISO-2022-JP i wyjściowy stan dekodera ISO-2022-JP na state.
    2. Niech output flag będzie flagą wyjścia ISO-2022-JP.
    3. Ustaw flagę wyjścia ISO-2022-JP.
    4. Zwróć kontynuowanie jeśli output flag jest nieustawiona, w przeciwnym razie błąd.
  8. Niech lead i byte poprzedza stream.
  9. 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.
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:

  1. 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.
  2. Jeśli code point jest końcem strumienia i stanem kodera ISO-2022-JP jest ASCII, to zwróć zakończenie.
  3. Jeśli stanem kodera ISO-2022-JP jest ASCII lub Roman i code point jest wartością U+000E, U+000F lub U+001B, to zwróć błąd włącznie z U+FFFD.

    Zwracanie U+FFFD zamiast oryginalnego punktu kodowego ma chronić przed atakami.

  4. 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.
  5. Jeśli stanem kodera ISO-2022-JP jest Roman i code point jest punktem kodowym ASCII (z wykluczeniem U+005C i U+007E) lub jest wartością U+00A5 czy U+203E, to wykonaj poniższe podkroki:

    1. Jeśli code point jest punktem kodowym ASCII, to zwróć bajt, którego wartością jest code point.
    2. Jeśli code point jest wartością U+00A5, to zwróć bajt 0x5C.
    3. Jeśli code point jest wartością U+203E, to zwróć bajt 0x7E.
  6. 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.
  7. Jeśli code point jest wartością U+00A5 lub U+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 bajty 0x1B 0x28 0x4A.
  8. Jeśli code point jest wartością U+2212, to ustaw go na U+FF0D.
  9. Niech pointer będzie wskaźnikiem indeksu dla code point w indeksie jis0208.
  10. Jeśli pointer jest wartością null, to zwróć błąd włącznie z code point.
  11. 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.
  12. Niech lead będzie wynikiem obliczenia floor(pointer / 94) + 0x21.
  13. Niech trail będzie wynikiem obliczenia pointer % 94 + 0x21.
  14. 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:

  1. 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.
  2. Jeśli byte jest końcem strumienia i wiodący Shift_JIS ma wartość 0x00, to zwróć zakończenie.
  3. 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:

    1. Niech offset będzie wartością 0x40 jeśli byte jest mniejszy od wartości 0x7F, w przeciwnym razie wartością 0x41.
    2. Niech lead offset będzie wartością 0x81 jeśli lead jest mniejszy od wartości 0xA0, w przeciwnym razie wartością 0xC1.
    3. Jeśli byte jest w zakresie 0x40 do 0x7E, włącznie, lub 0x80 do 0xFC, włącznie, to ustaw pointer na wynik obliczenia (lead - lead offset) * 188 + byte - offset.
    4. 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.
    5. Jeśli code point jest wartością null i pointer jest w zakresie 8836 do 10528, włącznie, to zwróć punkt kodowy, którego wartością jest wynik obliczenia 0xE000 + pointer - 8836.

      Jest to interoperacyjne dziedzictwo z Windowsa znane jako EUDC.

    6. Jeśli code point jest wartością null i byte jest bajtem ASCII, to niech byte poprzedza stream.
    7. Jeśli code point jest wartością null, to zwróć błąd.
    8. Zwróć punkt kodowy, którego wartością jest code point.
  4. Jeśli byte jest bajtem ASCII lub wartością 0x80, to zwróć punkt kodowy, którego wartością jest byte.
  5. Jeśli byte jest w zakresie 0xA1 do 0xDF, włącznie, to zwróć punkt kodowy, którego wartością jest wynik obliczenia 0xFF61 + byte - 0xA1.
  6. Jeśli byte jest w zakresie 0x81 do 0x9F, włącznie, lub 0xE0 do 0xFC, włącznie, to ustaw wiodący Shift_JIS na byte i zwróć kontynuowanie.
  7. 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:

  1. Jeśli code point jest końcem strumienia, to zwróć zakończenie.
  2. Jeśli code point jest punktem kodowym ASCII lub wartością U+0080, to zwróć bajt, którego wartością jest code point.
  3. Jeśli code point jest wartością U+00A5, to zwróć bajt 0x5C.
  4. Jeśli code point jest wartością U+203E, to zwróć bajt 0x7E.
  5. Jeśli code point jest w zakresie U+FF61 do U+FF9F, włącznie, to zwróć bajt, którego wartością jest wynik obliczenia code point - 0xFF61 + 0xA1.
  6. Jeśli code point jest wartością U+2212, to ustaw go na U+FF0D.
  7. Niech pointer będzie wskaźnikiem indeksu Shift_JIS dla code point.
  8. Jeśli pointer jest wartością null, to zwróć błąd włącznie z code point.
  9. Niech lead będzie wynikiem obliczenia floor(pointer / 188).
  10. Niech lead offset będzie wartością 0x81 jeśli lead jest mniejszy od wartości 0x1F, w przeciwnym razie wartością 0xC1.
  11. Niech trail będzie wynikiem obliczenia pointer % 188.
  12. Niech offset będzie wartością 0x40 jeśli trail jest mniejszy od wartości 0x3F, w przeciwnym razie wartością 0x41.
  13. 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:

  1. 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.
  2. Jeśli byte jest końcem strumienia i wiodący EUC-KR ma wartość 0x00, to zwróć zakończenie.
  3. 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:

    1. Jeśli byte jest w zakresie 0x41 do 0xFE, włącznie, to ustaw pointer na wynik obliczenia (lead0x81) * 190 + (byte0x41).
    2. 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.
    3. Jeśli code point jest wartością null i byte jest bajtem ASCII, to niech byte poprzedza stream.
    4. Jeśli code point jest wartością null, to zwróć błąd.
    5. Zwróć punkt kodowy, którego wartością jest code point.
  4. Jeśli byte jest bajtem ASCII, to zwróć punkt kodowy, którego wartością jest byte.
  5. Jeśli byte jest w zakresie 0x81 do 0xFE, włącznie, to ustaw wiodący EUC-KR na byte i zwróć kontynuowanie.
  6. 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:

  1. Jeśli code point jest końcem strumienia, to zwróć zakończenie.
  2. Jeśli code point jest punktem kodowym ASCII, to zwróć bajt, którego wartością jest code point.
  3. Niech pointer będzie wskaźnikiem indeksu dla code point w indeksie EUC-KR.
  4. Jeśli pointer jest wartością null, to zwróć błąd włącznie z code point.
  5. Niech lead będzie wynikiem obliczenia floor(pointer / 190) + 0x81.
  6. Niech trail będzie wynikiem obliczenia pointer % 190 + 0x41.
  7. 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:

  1. Jeśli byte jest końcem strumienia, to zwróć zakończenie.
  2. Jeśli flaga zwrócenia błędu replacement jest nieustawiona, to ustaw flagę zwrócenia błędu replacement i zwróć błąd.
  3. 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:

  1. 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.
  2. 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.
  3. Jeśli wiodący bajt UTF-16 jest wartością null, to ustaw wiodący bajt UTF-16 na byte i zwróć kontynuowanie.
  4. 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.

  5. 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:

    1. Jeśli code unit jest w zakresie U+DC00 do U+DFFF, włącznie, to zwróć punkt kodowy, którego wartością jest wynik obliczenia 0x10000 + ((lead surrogate - 0xD800) << 10) + (code unit - 0xDC00).
    2. Niech bytes będą zwracaną wartością otrzymaną z wykonania poniższych wewnętrznych podkroków:

      1. Niech byte1 będzie wynikiem obliczenia code unit >> 8.
      2. Niech byte2 będzie wynikiem obliczenia code unit & 0x00FF.
      3. 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
    3. Niech bytes poprzedza stream i zwróć błąd.
  6. Jeśli code unit jest w zakresie U+D800 do U+DBFF, włącznie, to ustaw wiodący surogat UTF-16 na code unit i zwróć kontynuowanie.
  7. Jeśli code unit jest w zakresie U+DC00 do U+DFFF, włącznie, to zwróć błąd.
  8. 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:

  1. Jeśli byte jest końcem strumienia, to zwróć zakończenie.
  2. Jeśli byte jest bajtem ASCII, to zwróć punkt kodowy, którego wartością jest byte.
  3. 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:

  1. Jeśli code point jest końcem strumienia, to zwróć zakończenie.
  2. Jeśli code point jest punktem kodowym ASCII, to zwróć bajt, którego wartością jest code point.
  3. Jeśli code point jest w zakresie U+F780 do U+F7FF, włącznie, to zwróć bajt, którego wartością jest wynik obliczenia code point - 0xF780 + 0x80.
  4. 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.

Pasek społecznościowy

SPIS TREŚCI AKTUALNEJ STRONY

Ogólne (H1) Encoding (H2) Preface (H3) Security background (H3) Terminology (H3) byte (H4) ASCII byte (H4) code point (H4) scalar value (H4) ASCII code point (H4) ASCII whitespace (H4) ASCII digits (H4) string (H4) ASCII case-insensitive (H4) token (H4) stream (H4) end-of-stream (H4) read (H4) prepended (H4) pushed (H4) Encodings (H3) encoding (H4) name (H4) label (H4) Encoders and decoders (H4) decoder (H5) encoder (H5) handler (H5) finished (H5) error (H5) continue (H5) error mode (H5) run (H5) process (H5) Names and labels (H4) get an encoding (H5) Output encodings (H4) get an output encoding (H5) Indexes (H3) index (H4) index code point (H4) index pointer (H4) index gb18030 ranges code point (H4) index gb18030 ranges pointer (H4) index Shift_JIS pointer (H4) index Big5 pointer (H4) Specification hooks (H3) decode (H4) UTF-8 decode (H4) UTF-8 decode without BOM (H4) UTF-8 decode without BOM or fail (H4) encode (H4) UTF-8 encode (H4) The encoding (H3) UTF-8 (H4) UTF-8 decoder (H5) UTF-8 encoder (H5) Legacy single-byte encodings (H3) single-byte encoding (H4) index single-byte (H4) single-byte decoder (H4) single-byte encoder (H4) Legacy multi-byte Chinese (simplified) encodings (H3) GBK (H4) GBK decoder (H5) GBK encoder (H5) gb18030 (H4) gb18030 decoder (H5) gb18030 first (H6) gb18030 second (H6) gb18030 third (H6) gb18030 encoder (H5) flagą GBK (H6) hz-gb-2312 (H4) hz-gb-2312 decoder (H5) hz-gb-2312 encoder (H5) Legacy multi-byte Chinese (traditional) encodings (H3) Big5 (H4) Big5 decoder (H5) Big5 lead (H6) Big5 encoder (H5) Legacy multi-byte Japanese encodings (H3) EUC-JP (H4) EUC-JP decoder (H5) EUC-JP jis0212 flag (H6) EUC-JP lead (H6) EUC-JP encoder (H5) ISO-2022-JP (H4) ISO-2022-JP decoder (H5) ISO-2022-JP decoder state (H6) ISO-2022-JP decoder output state (H6) ISO-2022-JP lead (H6) ISO-2022-JP output flag (H6) ISO-2022-JP encoder (H5) ISO-2022-JP encoder state (H6) Shift_JIS (H4) Shift_JIS decoder (H5) Shift_JIS lead (H6) Shift_JIS encoder (H5) Legacy multi-byte Korean encodings (H3) EUC-KR (H4) EUC-KR decoder (H5) EUC-KR lead (H6) EUC-KR encoder (H5) Legacy miscellaneous encodings (H3) replacement (H4) replacement decoder (H5) replacement error returned flag (H6) replacement encoder (H5) Common infrastructure for UTF-16BE and UTF-16LE (H4) convert a code unit to bytes (H5) shared UTF-16 decoder (H5) UTF-16 lead byte (H6) UTF-16 lead surrogate (H6) UTF-16BE decoder flag (H6) shared utf-16 encoder (H5) UTF-16BE (H4) UTF-16BE decoder (H5) utf-16be encoder (H5) UTF-16LE (H4) UTF-16LE decoder (H5) utf-16le encoder (H5) x-user-defined (H4) x-user-defined decoder (H5) x-user-defined encoder (H5) Browser UI (H3)