Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
31 |
Tags
- Jndi DataSource
- 개방 폐쇄 원칙
- Reading HttpServletRequest Multiple Times
- mapstruct
- AfterMapping
- graphql
- Socket is closed
- Tomcat DBCP
- 이중정렬
- java
- Request Body 여러 번 사용
- HandlerMethodArgumentResolver
- try - with - resources
- Unchecked Exception
- Java Rest
- 데이터 압축
- Java Singleton
- 바이트 절삭
- NoUniqueBeanDefinitionException
- Graphql Client
- Sub Bytes
- 상호 인증
- Open Close Principal
- Checked Exception
- requestheaderdto
- Srping MVC
- WildFly
- mTLS
- Java Graphql
- tomcat jndi
Archives
- Today
- Total
Developer Sang Guy
Sub Bytes To String 본문
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 입니다.";
}
}
결과
한글 입니다. 하지만 영어�
한글 입니다. 하지만 영어
'Java' 카테고리의 다른 글
Stram Api를 활용한 정렬 (0) | 2024.07.18 |
---|---|
Lombok @Builder 사용 시 MapStruct @AfterMapping 동작 이슈 (0) | 2024.03.15 |
[JWT] Auth0을 활용한 JWT 생성 및 확인 (0) | 2023.04.10 |
[Java] Class에서 파일 읽어오기 (tomcat, wildfly) (0) | 2023.02.02 |
Socket is closed (0) | 2022.12.22 |
Comments