Java
Sub Bytes To String
은크
2024. 2. 14. 13:25
DataBase에 문자열 데이터 저장 시 Data Type의 Length가 지정되어 있다면 Database 또는 Table에 설정된 문자 인코딩으로 전환 된 바이트 배열의 길이 만큼 저장된다.
만약에 컬럼의 Length 보다 전환 된 바이트 배열의 길이가 더 길 경우 저장할 수 없다.
영어는 한 단어가 1byte라 실수하는 경우가 거의 없지만 한글을 사용할 경우 한 단어가 1byte가 아니라 종종 실수를 한다.
한글의 경우 문자 인코딩에 따라 bytes length가 다르다.
한국에서 주로 많이 사용하는 Charset은 UTF-8 과 EUC-KR로 예를 들면 UTF-8은 한 글자당 3byte이고 EUC-KR은 2byte 이다.
public String subByteToStringNoCutting(String source, int endIndex) {
byte[] slice = Arrays.copyOfRange(source.getBytes(), 0, endIndex);
return new String(slice);
}
위와 같이 문자열을 바이트로 전환 후 길이 만큼 절삭하여 사용할 수도 있지만 한글은 3바이트로 한 글자가 완성되기에 아래와 같은 깨짐 현상이 발생할 수 있다.
코드
public static void main(String[] args) {
String temp = "한글 입니다. 하지만 영어도 있습니다. Hello World.";
System.out.println(subByteToStringNoCutting(temp, 36));
}
결과
한글 입니다. 하지만 영어�
아래 코드를 사용하면 지정 길이 초과할 경우 초과하는 길이 만큼의 byte를 절삭하여 글자 깨짐을 방지할 수 있다.
코드
public String subByteToStringCutting(String source, int endIndex) {
if (source != null && !source.isEmpty()) {
if (source.getBytes().length <= endIndex) {
return source;
} else {
StringBuilder sb = new StringBuilder(endIndex);
int cnt = 0;
for (char c : source.toCharArray()) {
cnt += String.valueOf(c).getBytes().length;
if (cnt > endIndex) {
break;
} else {
sb.append(String.valueOf(c));
}
}
return sb.toString();
}
} else {
return "공백이거나 null 입니다.";
}
}
결과
한글 입니다. 하지만 영어�
한글 입니다. 하지만 영어