유니코드


<aside> <img src="/icons/search_gray.svg" alt="/icons/search_gray.svg" width="40px" /> UTF-16

자바스크립트는 모든 문자열을 UTF-16으로 인코딩한다.

UTF-16은 기본적으로 2바이트(16비트)로 인코딩하지만, 2바이트로 표현할 수 없는 이모지, 특수 기호 같은 문자는 서로게이트 페어를 통해 4바이트를 사용한다. 이를 보충 문자라고 부른다.

서로게이트 페어는 U+10000(65536) 이상의 코드 포인트를 표현하기 위해 두 개의 2바이트 코드 조합으로 보충 문자를 표현하는 방식이다.

</aside>

자바스크립트는 유니코드를 사용해서 문자열을 인코딩한다. 유니코드는 전 세계의 다양한 문자와 기호를 표현할 수 있도록 설계된 국제 표준이다. 유니코드에서 각 문자는 고유한 코드 포인트(해당 문자열을 대표하는 숫자)를 가진다.

코드 포인트는 U+ 접두사와 16진수 숫자를 합친 표기법을 사용한다. 예를들어 알파벳 a의 코드포인트는 U+0061 이다. 여기서 16진수 61을 10진수로 표기하면 97이고, 이는 charCodeAt codePointAt 메서드가 반환하는 값과 동일하다.

'a'.charCodeAt(); // 97
'a'.codePointAt(); // 97

유니코드 U+D800(55296)부터 U+DFFF(57343) 까지의 코드는 단독으로는 완전한 문자를 나타낼 수 없다. 이 범위에 속하는 코드들은 서로게이트 페어라고 불리며, 4바이트로 인코딩된 문자를 표현할 때 사용된다. 이모지, 특수 기호, 다양한 국제 문자 등이 이 방식을 사용한다.

charCodeAt 메서드는 지정한 문자의 UTF-16 코드 유닛을 반환한다. 만약 해당 문자가 서로게이트 페어를 이루고 있다면 charCodeAt 메서드는 첫 번째 코드 유닛만 반환한다. 반면, codePointAt 메서드는 서로게이트 페어를 구성하는 두 코드 유닛을 결합하여 전체 유니코드 포인트를 반환한다. 때문에 이모지처럼 서로게이트 페어를 사용하는 문자의 전체 코드 포인트를 얻으려면 codePointAt 메서드를 사용해야 한다.

const emoji = "🙂"; // 서로게이트 페어를 사용하는 문자
console.log(emoji.length); // 2 (4바이트로 인코딩된 문자여서 length 2)

const firstUnit = emoji.charCodeAt(0); // 55357 (첫번째 코드 유닛)
const secondUnit = emoji.charCodeAt(1); // 56898 (두번째 코드 유닛)

const fullCodePoint = emoji.codePointAt(0); // 128578 (전체 코드 유닛)

유니코드 프로퍼티


유니코드의 모든 문자는 다양한 프로퍼티(속성)를 가지는데, 이 프로퍼티를 통해 해당 문자가 어떤 범주에 속하는지 등의 정보를 확인할 수 있다. 예를들어 Letter 프로퍼티는 특정 언어의 문자임을 나타내고 Number 프로퍼티는 숫자임을 나타낸다.

자바스크립트에선 정규식에 \\p{...} 유니코드 속성 이스케이프 문법을 사용해서 유니코드 속성을 식별할 수 있다. 이때 u 플래그를 붙여서 유니코드 모드를 활성화해야 한다.

const num = "10";
num.match(/\\p{Number}/u); // ['1', index: 0, input: '10', groups: undefined]
num.match(/\\p{Letter}/u); // null

주요 프로퍼티 목록은 아래와 같다. 모든 종류의 문자를 찾을 땐 L 혹은 Letter, 소문자를 찾을 땐 Ll 프로퍼티를 사용하면 된다. 아래 유니코드 프로퍼티를 활용해서 특정 언어의 단어나, 통화 단위 같은 특수 문자를 쉽게 검색할 수 있다.

대분류 소분류 축약 프로퍼티
문자(Letter) L 소문자(lowercase) Ll
조정(modifier) Lm
단어의 첫 글자를 대문자로(titlecase) Lt
대문자(uppercase) Lu
기타(other) Lo
숫자(Number) N 10진수(decimal digit) Nd
문자(letter number) Nl
기타(other) No
문장 부호(Punctuation) P 연결선(connector) Pc
대시(dash) Pd
처음 따옴표(initial quote) Pi
마지막 따옴표(final quote) Pf
열기(open) Ps
닫기(close) Pe
기타(other) Po
표시(Mark) M 간격 결합(spacing combining) Mc
묶음(enclosing) Me
비공백(non-spacing) Mn
기호(Symbol) S 통화(currency) Sc
수정(modifier) Sk
수학(math) Sm
기타(other) So
구분 기호(Separator) Z 줄(line) Zl
단락(paragraph) Zp
공백(space) Zs
기타(Other) C 제어(control) Cc
형식(format) Cf
할당되지 않음(not assigned) Cn
사용자 지정(private use) Co
서로게이트(surrogate) Cs

위 목록 외에도 파생된 프로퍼티도 있다. 유니코드는 매우 다양한 프로퍼티를 지원하는데 링크에서 문자별 프로퍼티 목록, 프로퍼티별 문자 목록 등을 확인할 수 있다.