본문 바로가기

공부/컴퓨터

Java char로 어떻게 16bit 이상의 문자를 표현할 수 있을까?

반응형

java.lang.Character

  • JDK 1.4 : Character information is based on the Unicode Standard, version 3.0.
  • JDK 5.0 : Character information is based on the Unicode Standard, version 4.0. 

Java에서 char 은 16bit 고정 길이를 가지도록 되어 있다.

하지만 unicode 의 값 중에는 U+0000 ~ U+FFFF 를 넘어서는 값도 있기 때문에 이에 대한 처리가 문제가 된다.

1

JDK 1.4의 api document 중에서 Character 에 관한 문서를 확인해 보고

( http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Character.html  )

JDK 5.0의 api document 중에서 Character 에 관한 문서를 확인해 보면 서로 틀린것을 알 수 있다.

( http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Character.html )



JDK 5.0에서는 Unicode Character Representations 항목이 추가 된 것을 알 수 있다.

  1. 유니코드의 표준이 16비트 이상도 표현하도록 변경되었다.
  2. 현재는 U+0000 부터 U+10FFFF 까지 정의되어 있다.
  3. U+0000 부터 U+FFFF 까지는 Basic Multiingual Plane(BMP)를 참고한다.
  4. U+FFFF 보다 큰것들은 supplementary cahcaters가 있어야 한다.
  5. Java 2 에서는 UTF-16을 사용한다.
  6. supplementary chacters는 char 두개로 이루어 진다.
  7. 첫번째 char은 U+D800 ~ UDBFF를 , 두번째 char은 U+DC00~U+DFFF 까지의 범위를 가진다.
  8. char은 BMP나 UTF-16인코딩만을 가리킬 수 있다. 
    1. 그러므로 char를 사용하는 메소드를 쓸때에는, supplementary char에 대해서는 메소드를 호출 하면 잘못된 값이 나올 수 있다.
    2. 예)  Character.isLetter('\uD840') 를 사용하면 false로 return 된다.
  9. int는 supplementary code point 도 가리킬 수 있다. 
    1. 하위 21bit 는 Unicode값을 가리키고, 상위 11비트는 항상 0로 채워져 있다.
    2. 21bit인 이유는 현재 Unicode 가  U+10FFFF 까지 가리킬 수 있기 때문이다. ( U+10FFFF를 2진수로 변경하면 총 21bit 만을 차지하게 된다. )
    3.  그러므로 int를 사용하는 char 관련 메소드를 사용할때에는 supplementary char에 대해서는 제대로 된 응답이 반환된다.
      1. 예)  Character.isLetter(0x2F81A) 를 사용하면 true로 return 된다.

반응형