Наши волонтёры ещё не перевели данную статью на Русский. Присоединяйтесь к нам и помогите сделать эту работу!
Вы можете также прочитать эту статью на English (US).

This is an experimental technology
Check the Browser compatibility table carefully before using this in production.

TextEncoder takes a stream of code points as input and emits a stream of bytes. For a more scalable, non-native library, see StringView – a C-like representation of strings based on typed arrays.

Note: Firefox, Chrome and Opera used to have support for encoding types other than utf-8 (such as utf-16iso-8859-2, koi8, cp1261, and gbk). As of Firefox 48 (ticket), Chrome 54 (ticket) and Opera 41, no other encoding types are available other than utf-8, in order to match the spec. In all cases, passing in an encoding type to the constructor will be ignored and a utf-8 TextEncoder will be created (the TextDecoder still allows for other decoding types). 

Note: There is a polyfill implementation to support all the legacy encodings in GitHub.

Constructor

TextEncoder()
Returns a newly constructed TextEncoder that will generate a byte stream with utf-8 encoding.

Properties

The TextEncoder interface doesn't inherit any property.

TextEncoder.encoding Read only
Is a DOMString containing the name of the encoder, that is a string describing the method the TextEncoder will use.

Methods

The TextEncoder interface doesn't inherit any method.

TextEncoder.encode()
Returns a Uint8Array containing utf-8 encoded text.

 

Polyfill

The below polyfill will only furfill the specs demanded by the W3 (no character encodings other than UTF-8 supported, unfourtunately ☹️).

 

if (typeof TextEncoder === "undefined") {
    TextEncoder=function TextEncoder(){};
    TextEncoder.prototype.encode = function encode(str) {
        "use strict"; // add a little speed, maybe?
        var Len = str.length, resPos = -1, resArr = new Uint8Array(Len * 3);
        for (var point=0, nextcode=0, i = 0; i !== Len; ) {
            point = str.charCodeAt(i), i += 1;
            if (point >= 0xD800 && point <= 0xDBFF) {
                if (i === Len) {
                    resArr[resPos += 1] = 0xef/*0b11101111*/; resArr[resPos += 1] = 0xbf/*0b10111111*/;
                    resArr[resPos += 1] = 0xbd/*0b10111101*/; break;
                }
                // https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae
                nextcode = str.charCodeAt(i);
                if (nextcode >= 0xDC00 && nextcode <= 0xDFFF) {
                    point = (point - 0xD800) * 0x400 + nextcode - 0xDC00 + 0x10000;
                    i += 1;
                    if (point > 0xffff) {
                        resArr[resPos += 1] = (0x1e/*0b11110*/<<3) | (point>>>18);
                        resArr[resPos += 1] = (0x2/*0b10*/<<6) | ((point>>>12)&0x3f/*0b00111111*/);
                        resArr[resPos += 1] = (0x2/*0b10*/<<6) | ((point>>>6)&0x3f/*0b00111111*/);
                        resArr[resPos += 1] = (0x2/*0b10*/<<6) | (point&0x3f/*0b00111111*/);
                        continue;
                    }
                } else {
                    resArr[resPos += 1] = 0xef/*0b11101111*/; resArr[resPos += 1] = 0xbf/*0b10111111*/;
                    resArr[resPos += 1] = 0xbd/*0b10111101*/; continue;
                }
            }
            if (point <= 0x007f) {
                resArr[resPos += 1] = (0x0/*0b0*/<<7) | point;
            } else if (point <= 0x07ff) {
                resArr[resPos += 1] = (0x6/*0b110*/<<5) | (point>>>6);
                resArr[resPos += 1] = (0x2/*0b10*/<<6)  | (point&0x3f/*0b00111111*/);
            } else {
                resArr[resPos += 1] = (0xe/*0b1110*/<<4) | (point>>>12);
                resArr[resPos += 1] = (0x2/*0b10*/<<6)    | ((point>>>6)&0x3f/*0b00111111*/);
                resArr[resPos += 1] = (0x2/*0b10*/<<6)    | (point&0x3f/*0b00111111*/);
            }
        }
        resArr = new Uint8Array(resArr.buffer.slice(0, resPos+1));
        return resArr;
    };
    Object.defineProperty(TextEncoder.prototype,"encoding",{get:function(){if(!(this
    instanceof TextEncoder))throw TypeError("Illegal invocation");else return"utf-8"}});
    if(typeof Symbol!=="undefined")TextEncoder.prototype[Symbol.toStringTag]="TextEncoder";
}

Specifications

Specification Status Comment
Encoding
The definition of 'TextEncoder' in that specification.
Living Standard Initial definition.

Browser compatibility

We're converting our compatibility data into a machine-readable JSON format. This compatibility table still uses the old format, because we haven't yet converted the data it contains. Find out how you can help!

Feature Chrome Firefox (Gecko) Internet Explorer Opera Safari (WebKit)
Basic support 38 19.0 (19.0) [1] No support 25 10.1
Available in Web Workers 38 20.0 (20.0) No support 25 10.1
Feature Android Webview Chrome for Android Firefox Mobile (Gecko) Firefox OS IE Phone Opera Mobile Safari Mobile
Basic support 38 38 19.0 (19.0) [1] 1.0.1 (19.0) No support ? 10.1
Available in Web Workers 38 38 20.0 (20.0) 1.0.1 (20.0) No support ? 10.1

[1] An earlier, and slightly different, version of the specification was implemented in Firefox 18.
[2] As of Firefox 48, Chrome 54 and Opera 41, no other encoding types are allowed other than utf-8. 

See also

Метки документа и участники

Внесли вклад в эту страницу: Peppesterest, zbjornson, jpmedley, chrisdavidmills, robbie0630, _jordan, erxin, merih, teoli, Noitidart, realityking, fusionchess
Обновлялась последний раз: Peppesterest,