TextEncoder
takes a stream of code points as input and emits a stream of UTF-8 bytes.
Note: There is a polyfill implementation to support non-UTF-8 text encodings on 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- Always returns "
utf-8
".
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 is compliant with the standard and therefore only supports UTF-8. 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 those cases a polyfill might be impractical for large strings. 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 |
---|---|---|
EncodingThe definition of 'TextEncoder' in that specification. | Living Standard | Initial definition. |
Browser compatibility
The compatibility table on this page is generated from structured data. If you'd like to contribute to the data, please check out https://github.com/mdn/browser-compat-data and send us a pull request.
Update compatibility data on GitHub
Desktop | Mobile | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
|
Chrome
Full support 38 |
Edge
Full support 79 |
Firefox Full support 19 Full support 19 Full support 18 Notes' Firefox 18 implemented an earlier and slightly different version of the specification. |
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 Full support 19 Full support 18 Notes' Firefox 18 implemented an earlier and slightly different version of the specification. |
Opera Android
Full support Yes |
Safari iOS
Full support 10.3 |
Samsung Internet Android
Full support 3.0 |
Chrome Full support 53 Full support 53 Notes' Does not accept parameters. Supports only Notes' Throws |
Edge Full support 79 Full support 79 Notes' Does not accept parameters. Supports only |
Firefox Full support 48 Full support 48 Notes' The constructor accepts an encoding type label argument, but the value is ignored. Only Notes' If the encoding type label argument is invalid, then a Notes' If the encoding type label argument is invalid, then a Notes' Firefox 18 implemented an earlier and slightly different version of the specification. |
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 Full support 48 Notes' The constructor accepts an encoding type label argument, but the value is ignored. Only Notes' If the encoding type label argument is invalid, then a Notes' If the encoding type label argument is invalid, then a Notes' Firefox 18 implemented an earlier and slightly different version of the specification. |
Opera Android
? |
Safari iOS
Full support 10.3 |
Samsung Internet Android
Full support 3.0 | |
Chrome
Full support 38 |
Edge
Full support 79 |
Firefox Full support 19 Full support 19 Full support 18 Notes' Firefox 18 implemented an earlier and slightly different version of the specification. |
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 Full support 19 Full support 18 Notes' Firefox 18 implemented an earlier and slightly different version of the specification. |
Opera Android
Full support Yes |
Safari iOS
Full support 10.3 |
Samsung Internet Android
Full support 3.0 | |
Chrome
Full support 74 |
Edge
Full support 79 |
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
Full support 11.0 | |
Chrome
Full support 38 |
Edge
Full support 79 |
Firefox Full support 19 Full support 19 Full support 18 Notes' Firefox 18 implemented an earlier and slightly different version of the specification. |
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 Full support 19 Full support 18 Notes' Firefox 18 implemented an earlier and slightly different version of the specification. |
Opera Android
Full support Yes |
Safari iOS
Full support 10.3 |
Samsung Internet Android
Full support 3.0 | |
Available in workers |
Chrome
Full support 38 |
Edge
Full support 79 |
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
Full support 3.0 |
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
TextEncoder by Mozilla Contributors is licensed under CC-BY-SA 2.5.