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

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

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

コンストラクター

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

プロパティ

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

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

メソッド

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

TextEncoder.encode()
入力として USVString を取り、 utf-8 でエンコードされたテキストを含む Uint8Array を返します。
TextEncoder.encodeInto()
エンコードする USVString と、 utf-8 でエンコードされたテキストをが入る宛先の Uint8Array を取り、エンコーディングの進捗を示す辞書オブジェクトを返します。これは encode() よりも新しく、より性能が高くなる可能性があります。

ポリフィル

以下のポリフィルは、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;
        // 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";
}

仕様書

仕様書 状態 備考
Encoding
TextEncoder の定義
現行の標準 初回定義

ブラウザーの対応

Update compatibility data on GitHub
デスクトップモバイル
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewAndroid 版 ChromeAndroid 版 FirefoxAndroid 版 OperaiOSのSafariSamsung Internet
TextEncoder
実験的
Chrome 完全対応 38Edge ? Firefox 完全対応 19
完全対応 19
完全対応 18
補足
補足 Firefox 18 implemented an earlier and slightly different version of the specification.
IE 未対応 なしOpera 完全対応 25Safari 完全対応 10.1WebView Android 完全対応 38Chrome Android 完全対応 38Firefox Android 完全対応 19
完全対応 19
完全対応 18
補足
補足 Firefox 18 implemented an earlier and slightly different version of the specification.
Opera Android 完全対応 ありSafari iOS 完全対応 10.1Samsung Internet Android 完全対応 あり
Available in Web Workers
実験的
Chrome 完全対応 38Edge ? Firefox 完全対応 20IE 未対応 なしOpera 完全対応 25Safari 完全対応 10.1WebView Android 完全対応 38Chrome Android 完全対応 38Firefox Android 完全対応 20Opera Android ? Safari iOS 完全対応 10.1Samsung 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 完全対応 10.1WebView Android 完全対応 38Chrome Android 完全対応 38Firefox 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 完全対応 10.1Samsung Internet Android ?
encoding
実験的
Chrome 完全対応 38Edge ? Firefox 完全対応 19
完全対応 19
完全対応 18
補足
補足 Firefox 18 implemented an earlier and slightly different version of the specification.
IE 未対応 なしOpera 完全対応 25Safari 完全対応 10.1WebView Android 完全対応 38Chrome Android 完全対応 38Firefox Android 完全対応 19
完全対応 19
完全対応 18
補足
補足 Firefox 18 implemented an earlier and slightly different version of the specification.
Opera Android 完全対応 ありSafari iOS 完全対応 10.1Samsung Internet Android 完全対応 あり
encode
実験的
Chrome 完全対応 38Edge ? Firefox 完全対応 19
完全対応 19
完全対応 18
補足
補足 Firefox 18 implemented an earlier and slightly different version of the specification.
IE 未対応 なしOpera 完全対応 25Safari 完全対応 10.1WebView Android 完全対応 38Chrome Android 完全対応 38Firefox Android 完全対応 19
完全対応 19
完全対応 18
補足
補足 Firefox 18 implemented an earlier and slightly different version of the specification.
Opera Android 完全対応 ありSafari iOS 完全対応 10.1Samsung Internet Android 完全対応 あり
encodeInto
実験的
Chrome 完全対応 74Edge 未対応 なしFirefox 完全対応 66IE 未対応 なしOpera 未対応 なしSafari 未対応 なしWebView Android 完全対応 74Chrome Android 完全対応 74Firefox Android 完全対応 66Opera Android 未対応 なしSafari iOS 未対応 なしSamsung Internet Android 未対応 なし

凡例

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

関連情報

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

このページの貢献者: mfuji09, mdnwebdocs-bot, yyss
最終更新者: mfuji09,