String.prototype.charCodeAt()
Baseline
Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since 2015年7月.
charCodeAt() メソッドは、指定された位置にある UTF-16 コード単位を表す 0 から 65535 までの整数を返します。
charCodeAt() は常に UTF-16 コード単位の並びとして文字列をインデックスするので、孤立サロゲートを返すかもしれません。コードポイント値全体を取得したい場合は、 String.prototype.codePointAt() を使用してください。
試してみましょう
const sentence = "The quick brown fox jumps over the lazy dog.";
const index = 4;
console.log(
`Character code ${sentence.charCodeAt(index)} is equal to ${sentence.charAt(
index,
)}`,
);
// 予想される結果: "Character code 113 is equal to q"
構文
charCodeAt(index)
引数
返値
0 から 65535 までの整数を返します。これは index で指定された位置の UTF-16 コード単位の値を表します。index が 0 ~ str.length - 1 の範囲外であった場合、charCodeAt() は NaN を返します。
解説
文字列の中の文字は、左から右に向けてインデックス付けされています。最初の文字の添字は 0 であり、最後の文字の添字は str という名前の文字列であれば str.length - 1 です。
Unicode のコードポイントは 0 から 1114111 (0x10FFFF) までの範囲です。charCodeAt() は常に 65536 より小さい値を返しますが、これは上位のコードポイントは 16 ビットのサロゲート擬似文字のペアによって表されているからです。したがって、65535 より大きい値を持つ完全な文字を取得するには、charCodeAt(i) だけでなく charCodeAt(i + 1) も取得するか(2 つの文字を持つ文字列を操作する場合と同じです)、または codePointAt(i) を使用する必要があります。Unicode に関する情報はUTF-16 文字、Unicode コードポイント、書記素クラスターを参照してください。
例
>charCodeAt() の使用
以下の例では、 Unicode 文字の A である 65 を返します。
"ABC".charCodeAt(0); // returns 65
charCodeAt() は妥当な Unicode 文字ではない、孤立サロゲートを返す可能性があります。
const str = "𠮷𠮾";
console.log(str.charCodeAt(0)); // 55362、または d842、これは妥当な Unicode 文字ではない
console.log(str.charCodeAt(1)); // 57271、または dfb7、これは妥当な Unicode 文字ではない
指定された位置の完全な Unicode コードポイントを取得するには、String.prototype.codePointAt() を使用してください。
const str = "𠮷𠮾";
console.log(str.codePointAt(0)); // 134071
メモ:
charCodeAt() を使用して codePointAt() を再実装することは避けてください。孤立サロゲートの検出とそのペアリングは複雑で、文字列の内部表現を直接使用する組み込み API の方がパフォーマンスが高いかもしれません。必要であれば、codePointAt() のポリフィルをインストールしてください。
以下は Unicode FAQ から引用した、UTF-16 コードユニットのペアを Unicode コードポイントに変換する可能なアルゴリズムです。
// constants
const LEAD_OFFSET = 0xd800 - (0x10000 >> 10);
const SURROGATE_OFFSET = 0x10000 - (0xd800 << 10) - 0xdc00;
function utf16ToUnicode(lead, trail) {
return (lead << 10) + trail + SURROGATE_OFFSET;
}
function unicodeToUTF16(codePoint) {
const lead = LEAD_OFFSET + (codePoint >> 10);
const trail = 0xdc00 + (codePoint & 0x3ff);
return [lead, trail];
}
const str = "𠮷";
console.log(utf16ToUnicode(str.charCodeAt(0), str.charCodeAt(1))); // 134071
console.log(str.codePointAt(0)); // 134071
仕様書
| Specification |
|---|
| ECMAScript® 2026 Language Specification> # sec-string.prototype.charcodeat> |
ブラウザーの互換性
Loading…