これは実験的な機能です。本番で使用する前にブラウザー実装状況をチェックしてください。

TextEncoder は連続したコードポイントを入力として受け取り、バイトストリームを出力します。よりスケーラブルな非ネイティブのライブラリーについて、StringView – typed array による、C ライクな文字列の表現をご覧ください。

注記: 以前の Firefox、Chrome、Opera は utf-8 以外のエンコード方式 (utf-16iso-8859-2koi8cp1261gbk など) をサポートしていました。Firefox 48 (ticket) 以降、Chrome 54 以降 (ticket)、Opera 41 以降は 仕様書 に合わせて utf-8 以外のエンコード方式を使用できなくなりました。どのブラウザーでもほかのエンコード方式をコンストラクターに渡しても無視され、utf-8 の TextEncoder を作成します (TextDecoder はほかのデコード方式を使用できます)。

注記: 古いエンコード方式をサポートするポリフィル実装が GitHub にあります。

コンストラクター

TextEncoder()
新たに生成した TextEncoder を返します。これは、utf-8 エンコード方式を使用してバイトストリームを生成します。

プロパティ

TextEncoder インターフェイスは、どのプロパティも継承しません。

TextEncoder.encoding 読取専用
エンコーダーの名称を持つ DOMString であり、これは TextEncoder が使用する方式を表す文字列です。

メソッド

TextEncoder インターフェイスは、どのメソッドも継承しません。

TextEncoder.encode()
utf-8 でエンコードされたテキストを含む Uint8Array を返します。

ポリフィル

以下のポリフィルは、W3 が要求する仕様だけを満たします (残念ながら、UTF-8 以外のエンコード方式はサポートしません☹)。"これだけで" IE5 で動作するように設計されていますが、IE5 から IE9 では TypedArray に代わって通常の配列を返します。メモリの効率が悪く遅いブラウザーのような状況では、このポリフィル (さらに言えばどのポリフィルも) は古いブラウザーと大きな文字列に対して実用的でないでしょう。最後に、0x1e << 3 のようなシーケンスを 0xf0 へ変換するため、以下のコードをミニファイアー (特にクロージャコンパイラー) を通して実行すべきであることに注意してください。これらのシーケンスはポリフィルの動作を美的に示すため、事前に計算されていません。

if (typeof TextEncoder === "undefined") {
    TextEncoder=function TextEncoder(){};
    TextEncoder.prototype.encode = function encode(str) {
        "use strict";
        var Len = str.length, resPos = -1;
        var resArr = typeof Uint8Array === "undefined" ? new Array(Len * 2) : 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 new Uint8Array(resArr.buffer.slice(0, resPos+1));
        else return resArr.length === resPos+1 ? resArr : resArr.slice(0, resPos+1); // IE 6-9
    };
    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";
}

仕様

仕様書 策定状況 コメント
Encoding
TextEncoder の定義
現行の標準 最初期の定義

ブラウザー実装状況

Update compatibility data on GitHub
デスクトップモバイル
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewAndroid 版 ChromeEdge MobileAndroid 版 FirefoxAndroid 版 OperaiOS 版 SafariSamsung Internet
基本対応
実験的
Chrome 完全対応 38Edge ? Firefox 完全対応 19
完全対応 19
完全対応 18
補足
補足 Firefox 18 implemented an earlier and slightly different version of the specification.
IE 未対応 なしOpera 完全対応 25Safari 未対応 なしWebView Android 完全対応 38Chrome Android 完全対応 38Edge Mobile ? Firefox Android 完全対応 19
完全対応 19
完全対応 18
補足
補足 Firefox 18 implemented an earlier and slightly different version of the specification.
Opera Android ? Safari iOS 未対応 なしSamsung Internet Android ?
Available in Web Workers
実験的
Chrome 完全対応 38Edge ? Firefox 完全対応 20IE 未対応 なしOpera 完全対応 25Safari 未対応 なしWebView Android 完全対応 38Chrome Android 完全対応 38Edge Mobile ? Firefox Android 完全対応 20Opera Android ? Safari iOS 未対応 なしSamsung Internet Android ?
TextEncoder() constructor
実験的
Chrome 完全対応 53
補足
完全対応 53
補足
補足 Does not accept parameters. Supports only utf-8 encoding.
未対応 38 — 53
補足
補足 Throws RangeError exception for unknown encoding types.
Edge ? Firefox 完全対応 48
補足
完全対応 48
補足
補足 The constructor accepts an encoding type label argument, but the value is ignored. Only utf-8 encoding is supported.
未対応 38 — 48
補足
補足 If the encoding type label argument is invalid, then a RangeError exception is thrown.
未対応 19 — 38
補足
補足 If the encoding type label argument is invalid, then a TypeError exception is thrown.
完全対応 18
補足
補足 Firefox 18 implemented an earlier and slightly different version of the specification.
IE 未対応 なしOpera 完全対応 25Safari 未対応 なしWebView Android 完全対応 38Chrome Android 完全対応 38Edge Mobile ? Firefox Android 完全対応 48
補足
完全対応 48
補足
補足 The constructor accepts an encoding type label argument, but the value is ignored. Only utf-8 encoding is supported.
未対応 38 — 48
補足
補足 If the encoding type label argument is invalid, then a RangeError exception is thrown.
未対応 19 — 38
補足
補足 If the encoding type label argument is invalid, then a TypeError exception is thrown.
完全対応 18
補足
補足 Firefox 18 implemented an earlier and slightly different version of the specification.
Opera Android ? Safari iOS 未対応 なしSamsung Internet Android ?
encoding
実験的
Chrome 完全対応 38Edge ? Firefox 完全対応 19
完全対応 19
完全対応 18
補足
補足 Firefox 18 implemented an earlier and slightly different version of the specification.
IE 未対応 なしOpera 完全対応 25Safari 未対応 なしWebView Android 完全対応 38Chrome Android 完全対応 38Edge Mobile ? Firefox Android 完全対応 19
完全対応 19
完全対応 18
補足
補足 Firefox 18 implemented an earlier and slightly different version of the specification.
Opera Android ? Safari iOS 未対応 なしSamsung Internet Android ?
encode
実験的
Chrome 完全対応 38Edge ? Firefox 完全対応 19
完全対応 19
完全対応 18
補足
補足 Firefox 18 implemented an earlier and slightly different version of the specification.
IE 未対応 なしOpera 完全対応 25Safari 未対応 なしWebView Android 完全対応 38Chrome Android 完全対応 38Edge Mobile ? Firefox Android 完全対応 19
完全対応 19
完全対応 18
補足
補足 Firefox 18 implemented an earlier and slightly different version of the specification.
Opera Android ? Safari iOS 未対応 なしSamsung Internet Android ?

凡例

完全対応  
完全対応
未対応  
未対応
実装状況不明  
実装状況不明
実験的。動作が変更される可能性があります。
実験的。動作が変更される可能性があります。
実装ノートを参照してください。
実装ノートを参照してください。

関連情報

ドキュメントのタグと貢献者

このページの貢献者: yyss
最終更新者: yyss,