→
その String 中の指定位置にある UTF-16 コード ユニットのコードを返します。
単一の UTF-16 コード ユニットで表現可能なコード ポイントであれば、UTF-16 コード ユニットは Unicode コード ポイントと一致します。Unicode コード ポイントが単一の UTF-16 コード ユニットで表現できない場合(値が 0xFFFF を超える場合)、返されるコード ユニットはそのコード ポイントのサロゲート ペアの最初の部分になります。コード ポイント値全体を取得したい場合は、codePointAt() を使用してください。
str | String、文字列。 |
---|---|
index | 整数で、0 以上。これが数値でない場合は、既定で 0 になります。 |
数値(Number)。0 ~ 65535。index の位置に要素がない場合は NaN を返します。
Unicode コード ポイントの範囲は、0 から 1114111(0x10FFFF)です。最初の 128 の Unicode コードポイントは、ASCII 文字エンコーディングに直接対応しています。(Unicode についての詳細は、を参照してください。)
これにより、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
このバージョンは、指定された位置の前に 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; }
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