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/
300x250
반응형
'Back-End > Java' 카테고리의 다른 글
[Java] JAVA에서 JSON API parse시 ALLOW_NON_NUMERIC_NUMBERS, Object타입 등의 에러해결 (0) | 2023.03.07 |
---|---|
[Java] RSA 방식을 이용한 전자 서명 (0) | 2023.02.15 |
[JAVA]JXLS, POI JAVA에서 Excel 사용하는 구현 방법 및 종류 비교 (0) | 2023.02.09 |
[Java]자바(Java) 한글 초성 검색 (0) | 2023.02.09 |
[Java]자바 한자를 한글로 변환 - UTF-8 (0) | 2023.02.09 |