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 항목이 추가 된 것을 알 수 있다.
- 유니코드의 표준이 16비트 이상도 표현하도록 변경되었다.
- 현재는 U+0000 부터 U+10FFFF 까지 정의되어 있다.
- U+0000 부터 U+FFFF 까지는 Basic Multiingual Plane(BMP)를 참고한다.
- U+FFFF 보다 큰것들은 supplementary cahcaters가 있어야 한다.
- Java 2 에서는 UTF-16을 사용한다.
- supplementary chacters는 char 두개로 이루어 진다.
- 첫번째 char은 U+D800 ~ UDBFF를 , 두번째 char은 U+DC00~U+DFFF 까지의 범위를 가진다.
- char은 BMP나 UTF-16인코딩만을 가리킬 수 있다.
- 그러므로 char를 사용하는 메소드를 쓸때에는, supplementary char에 대해서는 메소드를 호출 하면 잘못된 값이 나올 수 있다.
- 예) Character.isLetter('\uD840') 를 사용하면 false로 return 된다.
- int는 supplementary code point 도 가리킬 수 있다.
- 하위 21bit 는 Unicode값을 가리키고, 상위 11비트는 항상 0로 채워져 있다.
- 21bit인 이유는 현재 Unicode 가 U+10FFFF 까지 가리킬 수 있기 때문이다. ( U+10FFFF를 2진수로 변경하면 총 21bit 만을 차지하게 된다. )
- 그러므로 int를 사용하는 char 관련 메소드를 사용할때에는 supplementary char에 대해서는 제대로 된 응답이 반환된다.
- 예) Character.isLetter(0x2F81A) 를 사용하면 true로 return 된다.
'공부 > Java' 카테고리의 다른 글
| [Java/Tip] String.hashCode()는 유일한 값을 반환할까? (5) | 2008/11/18 |
|---|---|
| [Java/Tip] Specifc Debugging Tips for Swing - 4.2.1 Incorrect Threading (2) | 2008/11/05 |
| Java char로 어떻게 16bit 이상의 문자를 표현할 수 있을까? (0) | 2007/07/25 |
| Java의 Windows FileOutputStream 은 안전하지 않다.. (4) | 2007/01/12 |
| JBox API 1차 완성. ( http://box.net 관련 ) (0) | 2006/04/03 |
| 자바.. 창의력(?) 문제 ㅎㅎ ~~~ (0) | 2005/12/26 |