티스토리 뷰
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
}
참고
'[JAVA]' 카테고리의 다른 글
[Java] switch 표현식 (0) | 2023.03.21 |
---|---|
[Java] 자바 스레드와 동시성(5) - Thread Pool (스레드풀), Executor (1) | 2022.10.10 |
[Java] 자바 스레드와 동시성(4) - join(), sleep(), yield() (0) | 2022.10.09 |
[Java] 자바 스레드와 동시성(3) - 우선 순위 (0) | 2022.10.01 |
[Java] 자바 스레드와 동시성(2) - 메인 스레드 (0) | 2022.09.29 |
- Total
- Today
- Yesterday
- hot-deploy
- jdk13
- JPA
- Mockito
- aspectj
- IntelliJ
- java
- spring-security
- java11
- 파스칼 표기법
- 한글깨짐
- Redis
- JAVA8
- codepoint
- sgw
- JUnit
- 카멜 표기법
- 확인창
- chmod
- gradle
- jdk12
- Executor
- Jenkins
- ThreadPool
- spring
- thread priority
- junit5
- Visual Studio 2022
- JetBrains Mono
- Thread
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |