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-16
, iso-8859-2
, koi8
, cp1261
, and gbk
). As of Firefox 48 (bug 1257877), 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.
Example
const encoder = new TextEncoder() const view = encoder.encode('€') console.log(view); // Uint8Array(3) [226, 130, 172]
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.prototype.encoding
Read only- Is a
DOMString
containing the name of the encoder, that is a string describing the method theTextEncoder
will use.
Methods
The TextEncoder
interface doesn't inherit any method.
TextEncoder.prototype.encode()
- Takes a
USVString
as input, and returns aUint8Array
containing utf-8 encoded text. TextEncoder.prototype.encodeInto()
- Takes a
USVString
to encode and a destinationUint8Array
to put resulting utf-8 encoded text into, and returns a dictionary object indicating the progress of the encoding. This is potentially more performant than the olderencode()
method.
Polyfill
The below polyfill will only furfill the specs demanded by the W3 (no character encodings other than UTF-8 are supported, unfortunately ☹️). It is designed to work in IE5 "out of the box". However, in IE5-IE9, it will return a regular Array instead of a TypedArray. In such circumstances as these with such memory inefficient slow browsers, this polyfill (or any polyfill for that matter) would be impractical for large strings in such old browsers. Finally, note that you should run the below code through a minifier (especially closure compiler) to turn sequences like 0x1e << 3
into 0xf0
. These sequences are not already precomputed because they serve to aesthetically illustrate how the polyfill works.
if (typeof TextEncoder === "undefined") { TextEncoder=function TextEncoder(){}; TextEncoder.prototype.encode = function encode(str) { "use strict"; var Len = str.length, resPos = -1; // The Uint8Array's length must be at least 3x the length of the string because an invalid UTF-16 // takes up the equivelent space of 3 UTF-8 characters to encode it properly. However, Array's // have an auto expanding length and 1.5x should be just the right balance for most uses. var resArr = typeof Uint8Array === "undefined" ? new Array(Len * 1.5) : 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*/); } } if (typeof Uint8Array !== "undefined") return resArr.subarray(0, resPos + 1); // else // IE 6-9 resArr.length = resPos + 1; // trim off extra weight return resArr; }; TextEncoder.prototype.toString = function(){return "[object TextEncoder]"}; try { // Object.defineProperty only works on DOM prototypes in IE8 Object.defineProperty(TextEncoder.prototype,"encoding",{ get:function(){if(TextEncoder.prototype.isPrototypeOf(this)) return"utf-8"; else throw TypeError("Illegal invocation");} }); } catch(e) { /*IE6-8 fallback*/ TextEncoder.prototype.encoding = "utf-8"; } if(typeof Symbol!=="undefined")TextEncoder.prototype[Symbol.toStringTag]="TextEncoder"; }
Source: https://github.com/anonyco/FastestSmallestTextEncoderDecoder
Specifications
Specification | Status | Comment |
---|---|---|
Encoding The definition of 'TextEncoder' in that specification. |
Living Standard | Initial definition. |
Browser compatibility
Desktop | Mobile | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
TextEncoder | Chrome Full support 38 | Edge No support No | Firefox
Full support
19
| IE No support No | Opera Full support 25 | Safari Full support 10.1 | WebView Android Full support 38 | Chrome Android Full support 38 | Firefox Android
Full support
19
| Opera Android Full support Yes | Safari iOS Full support 10.3 | Samsung Internet Android Full support Yes |
TextEncoder() constructor | Chrome
Full support
53
| Edge No support No | Firefox
Full support
48
| IE No support No | Opera Full support 25 | Safari Full support 10.1 | WebView Android Full support 38 | Chrome Android Full support 38 | Firefox Android
Full support
48
| Opera Android ? | Safari iOS Full support 10.3 | Samsung Internet Android ? |
encode | Chrome Full support 38 | Edge No support No | Firefox
Full support
19
| IE No support No | Opera Full support 25 | Safari Full support 10.1 | WebView Android Full support 38 | Chrome Android Full support 38 | Firefox Android
Full support
19
| Opera Android Full support Yes | Safari iOS Full support 10.3 | Samsung Internet Android Full support Yes |
encodeInto | Chrome Full support 74 | Edge No support No | Firefox Full support 66 | IE No support No | Opera No support No | Safari No support No | WebView Android Full support 74 | Chrome Android Full support 74 | Firefox Android Full support 66 | Opera Android No support No | Safari iOS No support No | Samsung Internet Android No support No |
encoding | Chrome Full support 38 | Edge No support No | Firefox
Full support
19
| IE No support No | Opera Full support 25 | Safari Full support 10.1 | WebView Android Full support 38 | Chrome Android Full support 38 | Firefox Android
Full support
19
| Opera Android Full support Yes | Safari iOS Full support 10.3 | Samsung Internet Android Full support Yes |
Available in workers | Chrome Full support 38 | Edge No support No | Firefox Full support 20 | IE No support No | Opera Full support 25 | Safari Full support 10.1 | WebView Android Full support 38 | Chrome Android Full support 38 | Firefox Android Full support 20 | Opera Android ? | Safari iOS Full support 10.3 | Samsung Internet Android ? |
Legend
- Full support
- Full support
- No support
- No support
- Compatibility unknown
- Compatibility unknown
- Experimental. Expect behavior to change in the future.
- Experimental. Expect behavior to change in the future.
- See implementation notes.
- See implementation notes.
See also
- The
TextDecoder
interface describing the inverse operation. StringView
– a C-like representation of strings based on typed arrays- A shim allowing to use this interface in browsers that don't support it.
Components.utils.importGlobalProperties
- Node.js supports global export from v11.0.0