티스토리 뷰

[JAVA]

[Java] codePoint 메서드

handr95 2024. 10. 16. 22:06
반응형

1. codePointCount(int beginIndex, int endIndex)

  • beginIndex : 범위 시작 인덱스
  • endIndex : 범위 종료 인덱스

문자열 내에서 지정된 범위 안에 있는 유니코드 코드 포인트 개수를 반환합니다. 해당 메서드는 문자(char)가 아닌 코드 포인트(code point)를 기준으로 합니다. 서로게이트 페어(surrogate pair)로 표현되는 유니코드 문자를 정확하게 세는 데 유용합니다.

@Test
public void codePointCount_test() {
    String ex = "😀Hello";   // '😀'는 서로게이트 페어로 이루어진 하나의 유니코드 문자
    System.out.println(ex.codePointCount(0, ex.length()));  //6
    System.out.println(ex.length());  //7
}

 

 

※서로게이트 페어(surrogate pair)란?

서로게이트 페어는 유니코드에서 하나의 문자를 표현하기 위해 두 개의 16비트 char를 사용하는 방식입니다.

Java의 경우 내부적으로 문자를 16비트 크기(unsinged, 0 ~ 65,535)의 char로 표현하지만, 유니코드의 모든 문자를 16비트로 표현하기에는 충분하지 않기 떄문에 이를 해결하기 위해 서로게이트 페어라는 개념이 도입되었습니다.

유니코드는 약 110만 개의 문자를 표현할 수 있는 범위를 가지고 있으며, 이 중 초기 65,536개(0x0000 ~ 0xFFFF)는 BMP(Basic Multilingual Plane, 기본 다국어 평면)라고 불리는 영역입니다. 이영역의 문자는 하나의 char로 표현할 수 있습니다. 하지만 나머지 유니코드 문자는 16비트로는 표현할 수 없기 때문에, 보충 평면의(Supplementary Planes)의 문자는 서로게이트 페어를 사용하여 두개의 char로 표현됩니다.

 

서로게이트 페어의 구조

서로게이트 페어는 두 개의 16비트 char로 구성되며, 첫 번째 char는 상위 서로게이트(high surrogate), 두 번째 char는 하위 서로게이트(low surrogate)로 불립니다.

  • 상위 서로게이트 범위: 0xD800 ~ 0xDBFF(첫 6비트는 항상 고정되어 110110라는 값이 설정됨 - 상위/하위 구분 용도)
  • 하위 서로게이트 범위: 0xDC00 ~ 0xDFFF(첫 6비트는 항상 고정되어 110110라는 값이 설정됨 - 상위/하위 구분 용도)

서로 게이트 페어는 이 두 범위의 조합을 통해 유니코드의 보충 평면에 있는 문자를 표현합니다.

 

예시

‘💕’문자의 경우 앞서 설명했던 BMP 범위를 벗어나는 문자 이므로, 두 개의 char로 표현됩니다.

@Test
public void surrogatePair_test() {
    String heart = "💕";
    System.out.println(heart.length()); //2
}

이 경우, ‘💕’는 두 개의 char로 표현되지만, 실제로는 하나의 유니코드 문자입니다. 이렇게 하나의 유니코드 문자를 표현되기 위해 두 개의 16비트 char를 사용하는 경우 서로게이트 페어라고 말합니다.

 

2. codePoints()

문자열에 포함된 유니코드 코드 포인트를 스트림(IntSream)으로 반환합니다.

@Test
public void codePoints_test(){
    String surrogate = "😀Hello";
    /**
     * 128512
     * 72
     * 101
     * 108
     * 108
     * 111
     */
    surrogate.codePoints().forEach(System.out::println)
    /**
     * 55357
     * 56832
     * 72
     * 101
     * 108
     * 108
     * 111
     */
    surrogate.chars().forEach(System.out::println);
}

 

3. codePointAt(int index)

주어진 인덱스 위치의 유니코드 코드 포인트를 반환합니다. char 값이 아닌 코드 포인트를 반환하기 때문에, 서로게이트 페어 문자를 처리하기 좋습니다.

@Test
public void codePointAt_test(){
    String str = "😀Hello";
    int codePoint = str.codePointAt(0);
    System.out.println(codePoint);  // 128512 (😀의 코드 포인트)
    int index = str.charAt(0);
    System.out.println(index);  // 55357 (😀의 상위 서로게이트 값 반환)
}

 

4. offsetByCodePoints(int index, int codePointOffset)

  • index: 이동을 시작할 인덱스. 이 인덱스는 문자열에서 특정 char의 위치를 나타냅니다.
  • codePointOffset: 이동할 코드 포인트의 개수. 이 값은 양수이면 앞으로, 음수이면 뒤로 이동합니다.

주어진 인덱스 에서 시작하여, 지정된 코드 포인트 수만큼 앞으로 또는 뒤로 이동한 위치를 반환합니다.

@Test
public void offsetByCodePoints_test() {
    String str = "😀Hello";
    int newIndex = str.offsetByCodePoints(0, 2);  // 첫 번째 문자에서 두 번째 코드 포인트로 이동
    System.out.println(newIndex);  // 3 (😀는 서로게이트 페어로 2개의 char를 차지)
    System.out.println(str.charAt(newIndex));   // e
    
    str = "HHello";
    newIndex = str.offsetByCodePoints(0, 2); 
    System.out.println(newIndex);  // 2
    System.out.println(str.charAt(newIndex));   // e
}

 


참고

반응형
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함