MDN wants to talk to developers like you: https://qsurvey.mozilla.com/s3/8d22564490d8

String.prototype.charCodeAt()

charCodeAt() メソッドは、与えられたインデックスに位置する文字の UTF-16 コードを表す 0 から 65535 の整数を返します(UTF-16 コードユニットは、単一の UTF-16 コードユニットで表現可能なコードポイントの Unicode コードポイントと一致しますが、単一の UTF-16 コードユニットでは表現できないコードポイントのサロゲートペアの最初のコードユニットでもあります。 例えば Unicodeコードポイント> 0x10000)。コードポイント値全体を取得したいなら、codePointAt() を使用してください。

構文

str.charCodeAt(index)

引数

index
0 と文字列の長さの間の整数。指定されなかった場合のデフォルトは 0 です。

戻り値

与えれたインデックス位置の文字の UTF-16 コードユニット値を表す数値。index が範囲外だった場合、NaN

詳細

Unicode コードポイントの範囲は、0 から 1,114,111(0x10FFFF)です。最初の 128 の Unicode コードポイントは、ASCII 文字エンコーディングに直接対応しています。Unicode についての情報は、Values, variables, and literals#Unicode を参照してください。

charCodeAt() は常に 65,536【訳注: 2 の16乗】より小さい値を返すであろうことに注意してください。これは、より高いコードポイントは、実際の文字を含むように使用されている(下の値)の "代理" 擬似文字のペアで表されているためです。これにより、65,536 以上の値の個々の文字について完全な文字を検証したり再現したりするためには、charCodeAt(i) だけではなく、 charCodeAt(i+1)(2 文字の文字列を検証/再現する場合)か codePointAt(i) を代わりに使用する必要があります。下記の例 2 と 3 を見てください。

与えられたインデックスが 0 と文字列の長さの間にない場合、charCodeAt()NaN を返します。

後方互換: (JavaScript 1.2 のような)過去のバージョンでは、charCodeAt() メソッドは、与えられたインデックスの文字の ISO-Latin-1 コードセットの値を示す数を返します。ISO-Latin-1 コードセットの範囲は 0 から 255 です。最初の 0 から 127 までは ASCII 文字セットに直接対応しています。

charCodeAt() を使用する

次の例は、A のユニコード値である 65 を返します。

'ABC'.charCodeAt(0); // returns 65

文字列の前に存在するものが不明な場合、非 BMP 文字を操作できるように charCodeAt() を修正する

このバージョンは、指定されたインデックス位置の前に非 BMP 文字が存在するかどうかが不明な場合に for ループなどで使用される可能性があります。

function fixedCharCodeAt(str, idx) {
  // ex. fixedCharCodeAt('\uD800\uDC00', 0); // 65536
  // ex. fixedCharCodeAt('\uD800\uDC00', 1); // false
  idx = idx || 0;
  var code = str.charCodeAt(idx);
  var hi, low;
  
  // High surrogate (could change last hex to 0xDB7F to treat high
  // private surrogates as single characters)
  if (0xD800 <= code && code <= 0xDBFF) {
    hi = code;
    low = str.charCodeAt(idx + 1);
    if (isNaN(low)) {
      throw 'High surrogate not followed by low surrogate in fixedCharCodeAt()';
    }
    return ((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000;
  }
  if (0xDC00 <= code && code <= 0xDFFF) { // Low surrogate
    // We return false to allow loops to skip this iteration since should have
    // already handled high surrogate above in the previous iteration
    return false;
    /*hi = str.charCodeAt(idx - 1);
    low = code;
    return ((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000;*/
  }
  return code;
}

文字列の前に存在するものが分かっている場合、非 BMP 文字を操作できるように charCodeAt() を修正する

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);
    // Go one further, since one of the "characters" is part of a surrogate pair
    return ((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000;
  }
  return code;
}

仕様

仕様 ステータス コメント
ECMAScript 1st Edition (ECMA-262) 標準 初期定義。JavaScript 1.2 で実装。
ECMAScript 5.1 (ECMA-262)
String.prototype.charCodeAt の定義
標準  
ECMAScript 2015 (6th Edition, ECMA-262)
String.prototype.charCodeAt の定義
標準  
ECMAScript 2017 Draft (ECMA-262)
String.prototype.charCodeAt の定義
ドラフト  

ブラウザー実装状況

機能 Chrome Firefox (Gecko) Internet Explorer Opera Safari
基本サポート (有) (有) (有) (有) (有)
機能 Android Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
基本サポート (有) (有) (有) (有) (有) (有)

関連項目

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

 このページの貢献者: YuichiNukiyama, teoli, clariroid, siokoshou, ethertank, Mgjbot, Potappo
 最終更新者: YuichiNukiyama,