.charCodeAt()

指定されたインデックスの文字のUnicode値の数値を返します。(コード位置が > 0x10000のUnicodeを除きます。)

文法

str.charCodeAt(index)
引数 説明
index 0以上で、文字列の長さより小さい数値を指定します。 もし、数値で無ければデフォルトの0が割り当てられます。

Unicodeのコードポイント範囲は、0から1,114,111です。 最初の128のUnicodeコードポイントは、そのままASCII文字エンコードとマッチします。 詳しい情報については、JavaScriptガイドを参照してください。

charCodeAtは常に65,536より小さな値を返す事に注意してください。 これは、高いコードポイントは実際の文字を構成するのに使用される"サロゲート"の擬似文字のペアによって表されるためです。 このため、65,536個の値から個々の完全な文字を調べる、または再生成するには、 charCodeAt(i)だけでは無くcharCodeAt(i+1)も必要になります。(2文字によって1文字を表現します) 後述する2つ目と3つ目の例を参照してください。

指定されたindexが0以上ではない、または文字列の長さ以上である場合、 charCodeAtはNaNを返します。

後方互換性: 古いバージョン(JavaScript 1.2等)のcharCodeAtメソッドは、 指定されたインデックスの文字をISO-Latin-1のコードセットで示した数値を返します。 ISO-Latin-1のコードセットの範囲は0~255です。 始めの1~127は、そのままASCII文字セットにマッチします。

charCodeAtの使用例

下記の例は65を返します。これはUnicodeでAを表します。

"ABC".charCodeAt(0) // 65を返します。

例: charCodeAtを非BMP(non-Basic-Multilingual-Plane(基本多言語面))文字を扱えるように改良(先に非BMPがあるか分からないケースで)

これは、forループ時に指定したindex位置よりも前に、 非BMP文字が存在するかもしれないようなケースで使用することが可能です。

function fixedCharCodeAt (str, idx) {
    // 例: fixedCharCodeAt ('\uD800\uDC00', 0); // 65536
    // 例: fixedCharCodeAt ('\uD800\uDC00', 1); // false
    idx = idx || 0;
    var code = str.charCodeAt(idx);
    var hi, low;

    // 上位サロゲート
    // (単一の文字として上位プライベート(?)サロゲートを扱うために、
    // 後ろの16進数を0xDB7Fに変えます。
    if (0xD800 <= code && code <= 0xDBFF) {
        hi = code;
        low = str.charCodeAt(idx+1);
        if (isNaN(low)) {
            // fixedCharCodeAt()内の下位サロゲートが、上位サロゲートの後ろに続いていません。
            throw 'High surrogate not followed by low surrogate in fixedCharCodeAt()';
        }
        return ((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000;
    }
    //下位サロゲート
    if (0xDC00 <= code && code <= 0xDFFF) {
        // 既に上記の上位サロゲートは処理されているはずなので、
        // falseを返すことでこの繰り返し処理をスキップ出来るようにします。
        return false;
        /*
        hi = str.charCodeAt(idx-1);
        low = code;
        return ((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000;
        */
    }
    return code;
}

例: charCodeAtを非BMP(non-Basic-Multilingual-Plane(基本多言語面))文字を扱えるように改良(先に非BMPがあるか分かっているケースで)

function knownCharCodeAt (str, idx) {
    str += '';
    var code,
        end = str.length;

    var surrogatePairs = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g;
    while ((surrogatePairs.exec(str)) != null) {
        var li = surrogatePairs.lastIndex;
        if (li - 2 < idx) {
            idx++;
        }
        else {
            break;
        }
    }

    if (idx >= end || idx < 0) {
        return NaN;
    }

    code = str.charCodeAt(idx);

    var hi, low;
    if (0xD800 <= code && code <= 0xDBFF) {
        hi = code;
        low = str.charCodeAt(idx+1);
        // 1つの文字はサロゲートペアの一部であるため、もう一歩踏み込みます。
        return ((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000;
    }
    return code;
}

仕様

ブラウザ互換性

デスクトップ
機能 Chrome Firefox
(Gecko)
IE Opera Safari
基本
モバイル
機能 Android Chrome for
Android
Firefox
Mobile
IE
Mobile
Opera
Mobile
Safari
Mobile
基本

関連項目

 Back to top

© 2017 Mozilla Contributors
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.

このページは、ページトップのURL先のMozilla Developer Network(以下、MDN)のコンテンツを翻訳した内容を基に構成されています。 構成について異なる点も含まれますので、下記の項目を確認し、必要に応じて元のコンテンツをご確認ください。 もし、誤訳などの間違いを見つけましたら、 @tomofまで教えていただければ幸いです。

  • 特定のブラウザに特化しすぎている情報やあまりにも古い情報、 または試験的に導入されているようなAPIや機能については、省略していることがあります。
  • 例やデモについて、実際にページ内で動作させる関係で一部ソースコードを変更している場合や、 その例で使用しているコンテンツの単語や文章などを日本人向けに変更しいてる場合があります。
  • MDNの更新頻度が高いため、元のコンテンツと比べ情報が古くなっている可能性があります。
  • "訳注:"などの断わりを入れた上で、日本人向けの情報の追記を行っている事があります。