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 Latest 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 |
|---|---|---|---|---|---|---|
| 基本サポート | (有) | (有) | (有) | (有) | (有) | (有) |