Back-End/Java

[Java] 자바 byte 단위로 문자열 자르기

HMHA 2023. 2. 10. 11:45
300x250
반응형

자바에서 문자열 길이를 byte 단위로 가져오는 방법은 다음과 같다.

UTF-8 기준 한글은 3바이트, 알파벳 대소문자나 숫자 및 띄어쓰기는 1바이트로 계산된다.

String str = “테스트”;
int bytesLen = str.getBytes().length;

문자열을 byte 단위로 자르기 위해서는 String 생성자를 이용하는 방법이 있다.

알파벳 대소문자와 숫자만으로 이뤄진 문자열을 자르기 위해서는 가장 좋은 방법이다.

아래는 6바이트까지 문자열을 자르는 예제다.

String str = “테스트”;

int endBytes = 6;
String result = new String(str.getBytes(), 0, endBytes);

그런데 new String(str.getBytes(), 0, endBytes) 코드를 사용하면 한글 바이트에 딱 맞춰 자르지 않는 경우 깨지는 문제가 있었다.

예를 들어 “테스트”를 3바이트까지 자르면 “테”가 되고, 6바이트까지 자르면 “테스”가 되지만, “테스트”를 7바이트까지 자르면 끝에 깨진 문자열이 붙는다.

따라서 한글을 포함하는 문자열을 고려한 메서드를 따로 만들었다.

/**
 * 문자열을 바이트 단위로 substring하기
 *
 * new String(str.getBytes(), 0, endBytes) 코드를 사용하면
 * 한글 바이트에 딱 맞춰 자르지 않는 경우 깨지는 문제가 있어서 따로 메서드를 만들었다.
 *
 * UTF-8 기준 한글은 3바이트, 알파벳 대소문자나 숫자 및 띄어쓰기는 1바이트로 계산된다.
 *
 * @param str
 * @param beginBytes
 * @param endBytes
 * @return
 */
public static String substringByBytes(String str, int beginBytes, int endBytes) {
    if (str == null || str.length() == 0) {
        return “”;
    }
 

     if (beginBytes < 0) {
        beginBytes = 0;
    }

    if (endBytes < 1) {
        return “”;
    }

    int len = str.length();

    int beginIndex = -1;
    int endIndex = 0;

    int curBytes = 0;
    String ch = null;
    for (int i = 0; i < len; i++) {
        ch = str.substring(i, i + 1);
        curBytes += ch.getBytes().length;
 

        if (beginIndex == -1 && curBytes >= beginBytes) {
            beginIndex = i;
        }

        if (curBytes > endBytes) {
            break;
        } else {
            endIndex = i + 1;
        }
    }
 

    return str.substring(beginIndex, endIndex);
}

원글 참고사이트 1 : https://goni9071.tistory.com/237

원글 참고사이트 2 : https://m.blog.naver.com/mk1126sj/221037624213

 


 

출처 : http://it-archives.com/222407554448/

 

[JAVA] 자바 byte 단위로 문자열 자르기 (java substring by bytes) – 흑곰의 유익한 블로그 2호점

[JAVA] 자바 byte 단위로 문자열 자르기 (java substring by bytes) 자바에서 문자열 길이를 byte 단위로 가져오는 방법은 다음과 같다. UTF-8 기준 한글은 3바이트, 알파벳 대소문자나 숫자 및 띄어쓰기는 1바

it-archives.com

 

300x250
반응형