Developer Sang Guy

Sub Bytes To String 본문

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 입니다.";
	}
}


결과

한글 입니다. 하지만 영어�
한글 입니다. 하지만 영어

 

Comments