JavaScript

String.prototype.charCodeAt()メソッド

 編集:2022.08.16 by T.A.

その String 中の指定位置にある UTF-16 コード ユニットのコードを返します。

単一の UTF-16 コード ユニットで表現可能なコード ポイントであれば、UTF-16 コード ユニットは Unicode コード ポイントと一致します。Unicode コード ポイントが単一の UTF-16 コード ユニットで表現できない場合(値が 0xFFFF を超える場合)、返されるコード ユニットはそのコード ポイントのサロゲート ペアの最初の部分になります。コード ポイント値全体を取得したい場合は、codePointAt() を使用してください。

number=str.charCodeAt(index)
str String、文字列。
index 整数で、0 以上。これが数値でない場合は、既定で 0 になります。
戻り値

数値(Number)。0 ~ 65535。index の位置に要素がない場合は NaN を返します。

解説

Unicode コード ポイントの範囲は、0 から 1114111(0x10FFFF)です。最初の 128 の Unicode コードポイントは、ASCII 文字エンコーディングに直接対応しています。(Unicode についての詳細は、を参照してください。)

注: charCodeAt() は常に 65536 より小さい値を返すことに注意してください。これは、より高いコード ポイントは、実際の文字を含むように使用されている(下の値)の "代理" 擬似文字のペアで表されているためです。

これにより、65536 以上の値の個々の文字について完全な文字を検証したり再現したりするためには、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 文字セットに直接対応しています。

以下の例では、Unicode 文字の A である 65 を返します。

D='ABC'.charCodeAt(0); //=65
基本多言語面以外の文字が文字列の前方に存在するかどうか不明な場合に扱えるように 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;

  // ハイ サロゲート(ハイ プライベート サロゲートを 1 文字として扱うために、最後の 16 進数を 0xDB7F に変更できます)
  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
    // 前の反復で上記の上位サロゲートを既に処理しているはずなので、ループがこの反復をスキップできるように false を返します。
    return false;
    // hi = str.charCodeAt(idx - 1);
    // low = code;
    // return ((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000;
  }
  return code;
}
文字列の前方に基本多言語面以外の文字が存在することが分かっている場合に扱えるように 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);
    // 「文字」の 1 つがサロゲート ペアの一部であるため、さらに 1 つ進みます。
    return ((hi - 0xD800) * 0x400) +
      (low - 0xDC00) + 0x10000;
  }
  return code;
}
D='A你Z'.charCodeAt(1); //=55422
関連

codePointAt()


テスト