String.prototype.charCodeAt()

String 값의 charCodeAt() 메서드는 주어진 인덱스의 UTF-16 코드 단위를 표현하는 065535 사이의 정수를 반환합니다.

charCodeAt()은 항상 문자열을 UTF-16 코드 단위의 시퀀스로 색인하므로 론 서로게이트(lone surrogates)를 반환할 수 있습니다. 주어진 인덱스에서 전체 유니코드 코드 포인트를 가져오려면 String.prototype.codePointAt()를 사용합니다.

시도해보기

구문

js
charCodeAt(index)

매개변수

index

반환할 문자의 0 기반 인덱스. 정수로 변환되는 원칙에 따라 undefined은 0으로 변환됩니다.

반환 값

명시된 index에 있는 문자의 UTF-16 코드 단위 값를 표현하는 0 부터 65535사이의 정수입니다. 만약 index0부터 str.length - 1 사이의 범위를 벗어난다면 charCodeAt()NaN을 반환합니다.

설명

문자열의 문자는 왼쪽에서 오른쪽으로 색인됩니다. 첫 번째 문자의 인덱스는 0이고 str이라 불리는 문자열의 마지막 문자열의 인덱스는 str.length - 1입니다.

유니코드 코드 포인트 범위는 0에서 1114111(0x10FFFF)까지입니다. 더 높은 코드 포인트는 16비트 의사 문자의 서로게이트로 표현되기 때문에 charCodeAt()은 항상 65536보다 작은 값을 반환합니다. 따라서 65535보다 큰 값을 가진 전체 문자를 얻으려면 charCodeAt(i)뿐만 아니라 charCodeAt(i + 1)도 검색하거나(두 문자로 된 문자열을 조작하는 것처럼) codePointAt(i)를 대신 사용해야 합니다. 유니코드에 대해 정보를 더 알고 싶으시면 UTF-16 문자, 유니코드 코드 포인트 그리고 그래프 클러스터를 참고하시기 바랍니다.

예제

charCodeAt() 사용하기

다음 예제는 유니코드 값 A에 해당하는 65를 반환합니다.

js
"ABC".charCodeAt(0); // 65 반환

charCodeAt()은 유효한 유니코드 문자가 아닌 론 서로게이트(lone surrogates)를 반환할 수 있습니다.

js
const str = "𠮷𠮾";
console.log(str.charCodeAt(0)); // 유효한 유니코드 문자가 아닌 55362, 혹은 d842
console.log(str.charCodeAt(1)); // 유효한 유니코드 문자가 아닌 57271, 혹은 dfb7

주어진 인덱스의 온전한 유니코드 코드 포인트를 얻기 위해서는 String.prototype.codePointAt()를 사용하세요.

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

참고: charCodeAt()을 사용하여 codePointAt()을 다시 구현하지 마세요. UTF-16 서로게이트에서 유니코드 코드 포인트로의 변환은 복잡하며 codePointAt()은 문자열의 내부 표현을 직접 사용하므로 성능이 더 우수할 수 있습니다. 필요한 경우 codePointAt()에 대한 폴리필을 설치하시기 바랍니다.

아래는 유니코드 FAQ에서 발췌한 UTF-16 코드 단위 쌍을 유니코드 코드 포인트로 변환하는 가능한 알고리즘입니다.

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

명세서

Specification
ECMAScript Language Specification
# sec-string.prototype.charcodeat

브라우저 호환성

BCD tables only load in the browser

같이 보기