TextDecoder#
TextDecoder.decode()#
Metoda decode()
dekoduje przekazane dane binarne przy użyciu kodowaniaTE skojarzonego z danym dekoderem tekstowym i zwraca odpowiadające im dane tekstowe.
Opis działania#
Samo wywołanie i poszczególne jego części najlepiej objaśnić na zapisie składniowym:
var text = textDecoder.decode([input [, options]]);
gdzie poszczególne człony oznaczają:
- text - łańcuch znakowy reprezentujący zdekodowane dane binarne.
- textDecoder - dekoder tekstowy będący obiektem kontekstu.
- input - opcjonalne dane binarne przeznaczone do zdekodowania.
- options - opcjonalny słownik
TextDecodeOptions
, który pozwala przedefiniować poszczególne cechy procesu dekodowania. W przypadku JS będzie to standardowy obiekt z następującymi właściwościami i wartościami:stream
- boolowskietrue
ustawia flagę braku wyczyszczenia. Domyślną wartością jest boolowskiefalse
.
Algorytm wywołania metody decode(input, options)
nie jest skomplikowany. Dla lepszego zrozumienia tematu prezentuję go w całości:
- Jeśli flaga braku wyczyszczenia jest nieustawiona, to ustaw dekoderTD na nowy dekoder skojarzony z kodowaniemTD, ustaw strumieńTD na nowy strumień i usuń flagę widzianego BOM.
- Jeśli właściwość
stream
w options ma boolowską wartośćtrue
, to ustaw flagę braku wyczyszczenia, w przeciwnym razie usuń flagę braku wyczyszczenia. - Jeśli input został przekazany, to niech kopia input następuje po strumieniuTD.
- Niech output będzie nowym strumieniem.
Dopóki (while) prawda:
- Niech token będzie wynikiem odczytu ze strumieniaTD.
- Jeśli token jest końcem strumienia i flaga braku wyczyszczenia jest ustawiona, to zwróć wynik serializacji strumienia z przekazaniem output.
W przeciwnym razie wykonaj poniższe podkroki:
- Niech result będzie wynikiem przetwarzania z przekazaniem token, dekoderaTD, strumieniaTD, output oraz trybu błędu TD.
- Jeśli result jest zakończeniem, to zwróć wynik serializacji strumienia z przekazaniem output.
- W przeciwnym razie, jeśli result jest błędem, to zrzuć błąd
TypeError
. - W przeciwnym razie niczego nie rób.
Drugi argument przekazywany do metody decode()
umożliwia stopniowe dekodowanie i może być przydatny w sytuacji, kiedy dane wejściowe dla metody (pierwszy argument) napływają porcjami (tj. są strumieniowane).
Prosty przykład:
<!DOCTYPE html>
<html>
<head>
<script>
function makeDecode(input, encoding, variant){
var new_encoder = new TextEncoder();
var new_decoder = new TextDecoder(encoding);
var info = document.getElementById("info");
if (variant){
var encoded = new_encoder.encode();
var decode = new_decoder.decode();
}
else{
var encoded = new_encoder.encode(input);
var decode = new_decoder.decode(encoded);
}
var bytes_10 = "";
var bytes_16 = "";
var bufferLen = encoded.length;
for (var i = 0; i < bufferLen; i++){
bytes_10 += encoded[i] + " ";
bytes_16 += encoded[i].toString(16) + " ";
}
info.innerHTML = "Interfejs kodera tekstowego: " + new_encoder
+ "<br>" + "Argument z konstruktora (łańcuch): " + "utf-8"
+ "<br>" + "Właściwość encoding: " + new_encoder.encoding
+ "<br><br>" + "Argument z metody encode(): " + input
+ "<br>" + "Obiekt zwracany przez metodę encode(): " + encoded
+ "<br>" + "encoded.length: " + encoded.length
+ "<br>" + "encoded.byteLength: " + encoded.byteLength
+ "<br>" + "encoded.buffer: " + encoded.buffer
+ "<br>" + "encoded.BYTES_PER_ELEMENT: " + encoded.BYTES_PER_ELEMENT
+ "<br>" + "Wszystkie bajty z encoded (dziesiętnie): " + bytes_10
+ "<br>" + "Wszystkie bajty z encoded (hex): " + bytes_16
+ "<br><br><br>" + "Interfejs dekodera tekstowego: " + new_decoder
+ "<br>" + "Argument z konstruktora (łańcuch): " + encoding
+ "<br>" + "Właściwość encoding: " + new_decoder.encoding
+ "<br><br>" + "Argument z metody decode(): " + encoded
+ "<br>" + "Łańcuch znakowy zwracany przez metodę decode(): " + decode;
}
</script>
</head>
<body>
<p>Kliknij przycisk by zdekodować dane binarne (zakodowane wcześniej przez utf-8) przy użyciu określonego kodowania.</p>
<ul>
<li>
<div>Kodowanie utf-8 (prawidłowy wybór):</div>
<input type="button" value="decode()" onclick="makeDecode('', 'utf-8', 1)">
<input type="button" value="decode(encode(''))" onclick="makeDecode('', 'utf-8')">
<input type="button" value="decode(encode(' '))" onclick="makeDecode(' ', 'utf-8')">
<input type="button" value="decode(encode('a'))" onclick="makeDecode('a', 'utf-8')">
<input type="button" value="decode(encode('A'))" onclick="makeDecode('A', 'utf-8')">
<input type="button" value="decode(encode('ą'))" onclick="makeDecode('ą', 'utf-8')">
<input type="button" value="decode(encode('źdźbło'))" onclick="makeDecode('źdźbło', 'utf-8')">
<input type="button" value="decode(encode('\u007F'))" onclick="makeDecode('\u007F', 'utf-8')">
<input type="button" value="decode(encode('\u07FF'))" onclick="makeDecode('\u07FF', 'utf-8')">
<input type="button" value="decode(encode('\uFFFF'))" onclick="makeDecode('\uFFFF', 'utf-8')">
<input type="button" value="decode(encode('\u10FFFF'))" onclick="makeDecode('\u10FFFF', 'utf-8')">
</li>
<li>
<div>Kodowanie utf-16be (nieprawidłowy wybór):</div>
<input type="button" value="decode()" onclick="makeDecode('', 'utf-16be', 1)">
<input type="button" value="decode(encode(''))" onclick="makeDecode('', 'utf-16be')">
<input type="button" value="decode(encode(' '))" onclick="makeDecode(' ', 'utf-16be')">
<input type="button" value="decode(encode('a'))" onclick="makeDecode('a', 'utf-16be')">
<input type="button" value="decode(encode('A'))" onclick="makeDecode('A', 'utf-16be')">
<input type="button" value="decode(encode('ą'))" onclick="makeDecode('ą', 'utf-16be')">
<input type="button" value="decode(encode('źdźbło'))" onclick="makeDecode('źdźbło', 'utf-16be')">
<input type="button" value="decode(encode('\u007F'))" onclick="makeDecode('\u007F', 'utf-16be')">
<input type="button" value="decode(encode('\u07FF'))" onclick="makeDecode('\u07FF', 'utf-16be')">
<input type="button" value="decode(encode('\uFFFF'))" onclick="makeDecode('\uFFFF', 'utf-16be')">
<input type="button" value="decode(encode('\u10FFFF'))" onclick="makeDecode('\u10FFFF', 'utf-16be')">
</li>
<li>
<div>Kodowanie utf-16le (nieprawidłowy wybór):</div>
<input type="button" value="decode()" onclick="makeDecode('', 'utf-16le', 1)">
<input type="button" value="decode(encode(''))" onclick="makeDecode('', 'utf-16le')">
<input type="button" value="decode(encode(' '))" onclick="makeDecode(' ', 'utf-16le')">
<input type="button" value="decode(encode('a'))" onclick="makeDecode('a', 'utf-16le')">
<input type="button" value="decode(encode('A'))" onclick="makeDecode('A', 'utf-16le')">
<input type="button" value="decode(encode('ą'))" onclick="makeDecode('ą', 'utf-16le')">
<input type="button" value="decode(encode('źdźbło'))" onclick="makeDecode('źdźbło', 'utf-16le')">
<input type="button" value="decode(encode('\u007F'))" onclick="makeDecode('\u007F', 'utf-16le')">
<input type="button" value="decode(encode('\u07FF'))" onclick="makeDecode('\u07FF', 'utf-16le')">
<input type="button" value="decode(encode('\uFFFF'))" onclick="makeDecode('\uFFFF', 'utf-16le')">
<input type="button" value="decode(encode('\u10FFFF'))" onclick="makeDecode('\u10FFFF', 'utf-16le')">
</li>
</ul>
<p style="color: blue;">Szczegółowe informacje dla przeprowadzonej operacji dekodowania:</p>
<p id="info"></p>
</body>
</html>
Składnia Web IDL#
[Exposed=Window,Worker] interface TextDecoder { USVString decode(optional BufferSource input, optional TextDecodeOptions options); };
Specyfikacje i inne materiały#
Pasek społecznościowy