java.lang.Character
자바의 Character 문서에 Unicode Character Representations 부분이 있음. 간단히 기록.
Unicode Specification
Character
객체가 캡슐화하는char
데이터 타입은 오리지널 유니코드 명세에 기반.- 이는 문자character를 고정 넓이의 16 비트 엔티티fixed-width 16-bit entitie로 정의.
String
과 다르게 16비트가 넘어가는 문자를 표현할 수 없음을 말하는 듯.
supplementary characters
char
데이터 타입은 오리지널 유니코드 명세에 기반했지만, 유니코드는 그 이후로도 계속 변화했고 현재는 16비트 이상으로 표현되는 문자를 허용.- 유효한 코드 포인트code points 범위는 현재 U+0000에서 U+10FFFF 까지.
- Unicode scalar value라고 부름.
- 이 중에서 U+0000에서 U+FFFF까지의 문자 집합을 Basic Multilingual Plane(BMP)라고 부름.
- 그리고 U+FFFF를 넘어가는 코드 포인트의 문자들은 supplementary characters로 부름.
- 자바 플랫폼은 UTF-16을
char
배열과String
,StringBuffer
클래스에서 사용. - 그래서 supplementary characters를
char
값의 짝으로 표현. - About Supplementary Characters에 따르면 이 방식을 surrogate pair라고 부름.
- 첫 번째 값은 high-surrogates 범위(\uD800-\uDBFF)를 갖고,
- 두 번째 값은 low-surrogates 범위(\uDC00-\uDFFF)를 가짐.
*참고로, U+
나 \u
문자들은 뒤이은 숫자들이 16진수임을 나타냄.
code point
int
값은 모든 유니코드의 코드 포인트를 표현할 수 있음.- int의 최하위 21개 비트는 유니코드 코드 포인트를 나타내는 데 쓰임.
- 나머지 최상위 11개 비트는 0.
- 21개 비트가 쓰이는 까닭은 위에서 코드 포인트의 최대값이 U+10FFFF이기 때문.
- 바이너리 숫자로는 100001111111111111111 즉, 21자리.
- 10진수로는 111411.
supplementary character behavior
char
값만을 인자로 받는 메서드는 supplementary characters 지원 불가.- 예컨대,
Character.isLetter('\uD840')
은false
를 반환. - 하지만
\uD840
는 high-surrogates에 포함되는 대상. 문자열에서는 글자 표현에 사용되는 것. - 한편,
isLetter(int codePoint)
와 같이 int를 받는 메서드는 모든 유니코드 문자를 지원할 수 있음. Character.isLetter(0x2F81A)
는true
반환.
code point vs. code unit
문서 읽다 보면, code point와 code unit 차이가 궁금해짐. 여기 그 차이가 잘 설명되어 있음.
For example, the snowman glyph (☃) is a single code point but 3 UTF-8 code units, and 1 UTF-16 code unit.
© 2020 codehumane ― Powered by Jekyll and Textlog theme