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-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.
TextEncoder()
TextEncoder
that will generate a byte stream with utf-8 encoding.The TextEncoder
interface doesn't inherit any property.
TextEncoder.encoding
Read only
DOMString
containing the name of the encoder, that is a string describing the method the TextEncoder
will use.The TextEncoder
interface doesn't inherit any method.
TextEncoder.encode()
Uint8Array
containing utf-8 encoded text.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"; }
Specification | Status | Comment |
---|---|---|
Encoding The definition of 'TextEncoder' in that specification. | Living Standard | Initial definition. |
Desktop | ||||||
---|---|---|---|---|---|---|
Chrome | Edge | Firefox | Internet Explorer | Opera | Safari | |
Basic support | 38 | ? | 19
|
No | 25 | 10.1 |
Available in Web Workers | 38 | ? | 20 | No | 25 | 10.1 |
TextEncoder() constructor
|
53
|
? | 48
|
No | 25 | 10.1 |
encoding
|
38 | ? | 19
|
No | 25 | 10.1 |
encode
|
38 | ? | 19
|
No | 25 | 10.1 |
Mobile | |||||||
---|---|---|---|---|---|---|---|
Android webview | Chrome for Android | Edge Mobile | Firefox for Android | Opera for Android | iOS Safari | Samsung Internet | |
Basic support | 38 | 38 | ? | 19
|
? | 10.1 | ? |
Available in Web Workers | 38 | 38 | ? | 20 | ? | 10.1 | ? |
TextEncoder() constructor
|
38 | 38 | ? | 48
|
? | 10.1 | ? |
encoding
|
38 | 38 | ? | 19
|
? | 10.1 | ? |
encode
|
38 | 38 | ? | 19
|
? | 10.1 | ? |
TextDecoder
interface describing the inverse operation.StringView
– a C-like representation of strings based on typed arraysComponents.utils.importGlobalProperties
© 2005–2018 Mozilla Developer Network and individual contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/API/TextEncoder