TextDecoder#
new TextDecoder()#
Interfejs TextDecoder może być wywoływany w roli konstruktora, dzięki czemu pozwala na bezpośrednie tworzenie nowych dekoderów tekstowych wprost z interfejsu.
Opis działania#
Samo wywołanie i poszczególne jego części najlepiej objaśnić na zapisie składniowym:
var new_decoder = new TextDecoder([label = "utf-8" [, options]]);
gdzie poszczególne człony oznaczają:
- new_decoder - referencja do nowego dekodera tekstowego.
- label - łańcuch znakowy reprezentujący etykietę dla kodowania w nowym dekoderze tekstowym. Dopuszczalne są wszystkie etykiety z wyjątkiem tych, które wskazują na kodowanie replacement. Parametr jest opcjonalny z domyślną wartością ustawianą na "
utf-8
". - options - opcjonalny słownik
TextDecoderOption
, który pozwala przedefiniować poszczególne cechy dekodera tekstowego. W przypadku JS będzie to standardowy obiekt z następującymi właściwościami i wartościami:fatal
- boolowskietrue
ustawia tryb błędu na "fatal
", gdziefalse
pozostawia jego początkowy stan "replacement
". Domyślną wartością jest boolowskiefalse
.ignoreBOM
- boolowskietrue
ustawia flagę ignorowania BOM, gdziefalse
pozostawia jej początkowy stan nieaktywności. Domyślną wartością jest boolowskiefalse
.
Algorytm wywołania konstruktora new TextDecoder(label, options)
nie jest skomplikowany. Dla lepszego zrozumienia tematu prezentuję go w całości:
- Niech encoding będzie wynikiem pobrania kodowania z label.
- Jeśli encoding jest niepowodzeniem lub replacement, to zrzuć błąd
RangeError
. - Niech dec będzie nowym obiektem typu
TextDecoder
. - Ustaw kodowanieTD w dec na encoding.
- Jeśli właściwość
fatal
w options ma boolowską wartośćtrue
, to ustaw tryb błędu TD w dec na "fatal
". - Jeśli właściwość
ignoreBOM
w options ma boolowską wartośćtrue
, to ustaw flagę ignorowania BOM w dec. - Zwróć dec.
Obiekt zwracany przez konstruktor new TextDecoder()
implementuje interfejs TextDecoder, dlatego ma dostęp do wszystkich poleceń z tego interfejsu (oraz z kolejnych interfejsów w łańcuchu dziedziczenia).
Prosty przykład:
<!DOCTYPE html>
<html>
<head>
<script>
function createDecoder(label, options, variant){
var info = document.getElementById("info");
var passLabel;
var passOptions;
try{
if (variant == 0){
passLabel = "brak";
passOptions = "brak";
var new_decoder = new TextDecoder();
}
else if (variant == 1){
passLabel = label;
passOptions = "brak";
var new_decoder = new TextDecoder(label);
}
else {
passLabel = label;
passOptions = JSON.stringify(options);
var new_decoder = new TextDecoder(label, options);
}
info.innerHTML = "Interfejs dekodera tekstowego: " + new_decoder
+ "<br>" + "Pierwszy argument z konstruktora (łańcuch): " + passLabel
+ "<br>" + "Drugi argument z konstruktora (obiekt): " + passOptions
+ "<br>" + "Właściwość encoding: " + new_decoder.encoding
+ "<br>" + "Właściwość fatal: " + new_decoder.fatal
+ "<br>" + "Właściwość ignoreBOM: " + new_decoder.ignoreBOM;
}
catch(e){
info.innerHTML = "Wyjątek: " + e
+ "<br>" + "Pierwszy argument z konstruktora: " + passLabel
+ "<br>" + "Drugi argument z konstruktora: " + passOptions;
}
}
</script>
</head>
<body>
<p>Kliknij przycisk by utworzyć nowy obiekt TextDecoder.</p>
<ul>
<li>
<div>Prawidłowe wartości dla kodowania UTF-8:</div>
<input type="button" value="new TextDecoder()" onclick="createDecoder('', '', 0)">
<input type="button" value="new TextDecoder('utf8')" onclick="createDecoder('utf8', '', 1)">
<input type="button" value="new TextEncoder('UTF8')" onclick="createDecoder('UTF8', '', 1)">
<input type="button" value="new TextEncoder('utf-8', {})" onclick="createDecoder('utf-8', {}, 2)">
<input type="button" value="new TextEncoder('UtF-8', {fatal:true})" onclick="createDecoder('UtF-8', {fatal:true}, 2)">
<input type="button" value="new TextEncoder('unicode-1-1-utf-8', {ignoreBOM:true})" onclick="createDecoder('unicode-1-1-utf-8', {ignoreBOM:true}, 2)">
<input type="button" value="new TextEncoder('uNiCoDe-1-1-UTF-8', {fatal:false; ignoreBOM:false})" onclick="createDecoder('uNiCoDe-1-1-UTF-8', {fatal:false, ignoreBOM:false}, 2)">
</li>
<li>
<div>Prawidłowe wartości dla kodowania IBM866:</div>
<input type="button" value="new TextDecoder('866')" onclick="createDecoder('866', '', 1)">
<input type="button" value="new TextEncoder('cp866')" onclick="createDecoder('cp866', '', 1)">
<input type="button" value="new TextEncoder('CP866', {})" onclick="createDecoder('CP866', {}, 2)">
<input type="button" value="new TextEncoder('cSiBm866', {fatal:true})" onclick="createDecoder('cSiBm866', {fatal:true}, 2)">
<input type="button" value="new TextEncoder('ibm866', {ignoreBOM:true})" onclick="createDecoder('ibm866', {ignoreBOM:true}, 2)">
<input type="button" value="new TextEncoder('IbM866', {fatal:false; ignoreBOM:false})" onclick="createDecoder('IbM866', {fatal:false, ignoreBOM:false}, 2)">
</li>
<li>
<div>Nieobsługiwane wartości (zrzucony zostanie błąd):</div>
<input type="button" value="new TextDecoder('')" onclick="createDecoder('', '', 1)">
<input type="button" value="new TextDecoder('dowolnyTekst')" onclick="createDecoder('dowolnyTekst', '', 1)">
<input type="button" value="new TextDecoder('csiso2022kr')" onclick="createDecoder('csiso2022kr', '', 1)">
<input type="button" value="new TextDecoder('iso-2022-cn')" onclick="createDecoder('iso-2022-cn', '', 1)">
<input type="button" value="new TextDecoder('iso-2022-cn-ext')" onclick="createDecoder('iso-2022-cn-ext', '', 1)">
<input type="button" value="new TextDecoder('iso-2022-kr')" onclick="createDecoder('iso-2022-kr', '', 1)">
<input type="button" value="new TextDecoder('utf-8', '')" onclick="createDecoder('iso-2022-kr', '', 2)">
<input type="button" value="new TextDecoder('utf-8', 666)" onclick="createDecoder('iso-2022-kr', 666, 2)">
</li>
</ul>
<p style="color: blue;">Szczegółowe informacje dla nowego obiektu TextDecoder:</p>
<p id="info"></p>
</body>
</html>
Kolejny przykład testujący obsługę w wątkach roboczych:
<script>
var worker_fn = function(e){
var new_decoder = new TextDecoder();
var result = "Interfejs dekodera tekstowego: " + new_decoder
+ "<br>" + "Właściwość encoding: " + new_decoder.encoding
+ "<br>" + "Właściwość fatal: " + new_decoder.fatal
+ "<br>" + "Właściwość ignoreBOM: " + new_decoder.ignoreBOM;
self.postMessage(result);
};
var blob = new Blob(["onmessage = " + worker_fn.toString()], {type: "text/javascript"});
var worker = new Worker(window.URL.createObjectURL(blob));
worker.onmessage = function(e){
document.write(e.data);
document.close();
};
worker.postMessage("start");
</script>
Składnia Web IDL#
[Constructor(optional DOMString label = "utf-8", optional TextDecoderOptions options), Exposed=Window,Worker] interface TextDecoder { };
Specyfikacje i inne materiały#
Pasek społecznościowy