String.prototype.charCodeAt()

charCodeAt() 方法是 String 值的方法,它返回一个介于 065535 之间的整数,表示给定索引处的 UTF-16 代码单元。

charCodeAt() 始终将字符串索引为 UTF-16 代码单元 的序列,因此它可能会返回单个代理。要获取给定索引处的完整 Unicode 代码点,请使用 String.prototype.codePointAt()

试试看

语法

js
charCodeAt(index)

参数

index

要返回的字符的零基索引。 转换为整数undefined 转换为 0。

返回值

一个介于 065535 之间的整数,表示指定 index 处的字符的 UTF-16 代码单元值。如果 index 超出 0str.length - 1 的范围,charCodeAt() 将返回 NaN

描述

字符串中的字符从左到右索引。第一个字符的索引为 0,而名为 str 的字符串中最后一个字符的索引为 str.length - 1

Unicode 代码点范围从 01114111 (0x10FFFF)。charCodeAt() 始终返回小于 65536 的值,因为较高的代码点由一对 16 位代理伪字符表示。因此,为了获得大于 65535 的完整字符,有必要不仅检索 charCodeAt(i),还需要检索 charCodeAt(i + 1)(就像操作一个包含两个字符的字符串一样),或者使用 codePointAt(i) 代替。有关 Unicode 的信息,请参见 UTF-16 字符、Unicode 代码点和音位集群

示例

使用 charCodeAt()

以下示例返回 65,即 A 的 Unicode 值。

js
"ABC".charCodeAt(0); // returns 65

charCodeAt() 可能会返回单个代理,它们不是有效的 Unicode 字符。

js
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()

js
const str = "𠮷𠮾";
console.log(str.codePointAt(0)); // 134071

注意: 避免使用 charCodeAt() 重新实现 codePointAt()。从 UTF-16 代理到 Unicode 代码点的转换很复杂,而 codePointAt() 可能会更高效,因为它直接使用字符串的内部表示。如果需要,安装 codePointAt() 的 polyfill。

以下是一个将一对 UTF-16 代码单元转换为 Unicode 代码点的可能算法,改编自 Unicode 常见问题解答

js
// 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 语言规范
# sec-string.prototype.charcodeat

浏览器兼容性

BCD 表仅在浏览器中加载

另请参阅