String.prototype.charCodeAt()
charCodeAt() 方法返回一个介于 0 和 65535 之间的整数,表示给定索引处的 UTF-16 码单元。
charCodeAt() 始终将字符串索引为一系列 UTF-16 码单元,因此它可能会返回独立的代理码元。要获取给定索引处的完整 Unicode 码点,请使用 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,
)}`,
);
// Expected output: "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)(就像处理一个有两个字符的字符串一样),或者改用 codePointAt(i)。有关 Unicode 的信息,请参阅 UTF-16 字符、Unicode 码点和字形簇。
示例
使用 charCodeAt()
以下示例返回 65,即 A 的 Unicode 值。
"ABC".charCodeAt(0); // returns 65
charCodeAt() 可能会返回独立的代理码元,这些代理码元不是有效的 Unicode 字符。
const str = "𠮷𠮾";
console.log(str.charCodeAt(0)); // 55362, or d842, which is not a valid Unicode character
console.log(str.charCodeAt(1)); // 57271, or dfb7, which is not a valid Unicode character
要获取给定索引处的完整 Unicode 码点,请使用 String.prototype.codePointAt()。
const str = "𠮷𠮾";
console.log(str.codePointAt(0)); // 134071
注意: 避免使用 charCodeAt() 来重新实现 codePointAt()。UTF-16 代理码元到 Unicode 码点的转换很复杂,并且 codePointAt() 可能更具性能,因为它直接使用了字符串的内部表示。如果需要,请为 codePointAt() 安装 polyfill。
下面是从 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
规范
| 规范 |
|---|
| ECMAScript® 2026 语言规范 # sec-string.prototype.charcodeat |
浏览器兼容性
加载中…