티스토리 뷰
3169 줄.
주석 설명부터 차근 살펴보았다.
그런데 그 내용 중 유니코드가 U+000000 ~ U+10FFFF 까지 지원하는데 자바의 char는 UTF-16 체계이므로 저 범위를 커버하지 못하기에 이를 표현하기 위해 surrogate pairs를 사용한다는 내용이 있었다.
surrogate pairs가 무엇인가..
용어에 대한 정리가 필요했다.
초기에 유니코드는 16비트로 표현하도록 설계되었다. 그러나 동아시아권의 문자를 체계적으로 표현하기 위해 32비트까지 확장되었는데 이 확장을 기준으로 기존 16비트로 표현 가능한 범위 U+0000 ~ U+FFFF 사이의 문자를 Basic Multilingual Plane(BMP)라 부른다.
그리고 확장된 영역 U+10000 ~ U+10FFFF 의 문자를 Supplementary character라고 부른다.
character는 문자 단위의 추상 개념으로 사용하는 용어이며 고정된 형태나 값을 가지지 않는다. 이 추상 개념의 구체화된 것이 'A', 'ㄱ'이다.
character set 은 위 문자(character)들의 집합(collection)이다.
coded character set 또한 character set 인데 각각의 문자(character)에 고유한 번호가 할당된 집합을 뜻한다. 가령 'A'에는 0041(16진수)가 할당되어 있는데 십진수로 65에 상응한다. 유니코드 표준은 항상 16진수 표기법을 사용하므로 이 할당 번호를 통해 'A'는 U+0041로 표기하게 된다.
code points란 coded character set 안에서 사용될 수 있는 숫자들이다. coded character set은 타당한 code points의 범위를 정의하지만, 모든 범위에 code points가 할당되지 않았다.
character encoding scheme 란 coded character sets 의 각 숫자를 하나 이상의 고정된 길이 code units의 일련(sequences)으로 대응시키는 체계를 말한다. 바로 접할 수 있는 code unit 은 bytes이다. 그러나 16비트 또는 32비트 정수도 사용될 수 있다. 이러한 character encoding schemes로 UTF-8, UTF-16, UTF-32가 있으며 이는 유니코드 표준상의 coded character를 위한 character encoding schemes이다.
UTF-32는 매우 단순하게 모든 유니코드 값을 커버할 수 있다.
UTF-16은 BMP 까지는 커버할 수 있으나 Supplementary characters 들은 표현할 수 없다. 따라서 이 스킴에서는 Supplementary character를 2개의 code unit으로 인코딩하는데 하나는 high-surrogates 범위로(U+D800 ~ U+DBFF) 나머지 하나는 low-surrogates 범위(U+DC00 ~ U+DFFF)를 사용한다. 이는 UTF-16에서 U+D800 ~ U+DFFF 사이에는 어떤 문자도 할당되어 있지 않았기 때문에 가능하다. 즉 저 범위에는 code point가 없다. 앞서 말한, 모든 범위에 code points가 할당되지 않은 부분이 이런 부분이다.
UTF-8은 8비트로 문자를 표현하는 체계로 일반 ASCII문자(Basic Latin block)를 보통 대변한다. 이 이상의 문자를 표현하기 위해 추가 바이트를 사용한다. U+0080 ~ U+07FF 에 2 바이트, U+0800 ~ U+FFFF에 3바이트 그리고 U+10000 ~ U+10FFFF에 4 바이트를 사용한다. 2바이트 이상의 code points에서는 0x00 ~ 0x7F 값은 절대 나타나지 않는다. 따라서 이를 통해 이것이 여러 바이트로 표현해야 하는 문자인지 아닌지 구분이 가능해진다.
표는 아직 왜 저렇게 되는지 해석하지는 못했다.
기존 Java 에서 확장된 유니코드 체계를 지원하기 위한 논의를 위해 전문가 그룹이 모였고 이들을 JSR-204 그룹이라 불렀다고 한다. 이 이후 내용도 곧바로 확인해서 글을 작성하도록 하겠다.
[참고링크] www.oracle.com/technical-resources/articles/javase/supplementary.html
'Java' 카테고리의 다른 글
String Class 를 열어보다(일부 메서드). (0) | 2021.03.22 |
---|---|
String Class 를 열어보다(시작)-3. 생성자..? (0) | 2021.03.21 |
com.amazonaws.services.s3.AmazonS3ClientBuilder의 standard() 메서드의 호출 위치. (0) | 2020.11.09 |
Java ConditionalOnClass 어노테이션 (0) | 2020.11.05 |
Java @Generated 어노테이션 (0) | 2020.11.05 |