오픈소스를 보다가 다음과 같은 메소드를 사용한 걸 발견했다.
byte[] res = text.getBytes("utf-8");
위 메소드를 보고 가장 처음 든 궁금증은 '왜 String을 바이트코드로 변경할까?' 였다.
궁금증을 해결하기 위해 우선 String의 getBytes 메소드가 어떤 메소드인지 찾아보았다.
String name = "김정환"; byte[] encodedName = name.getBytes("utf-8");
간단히 설명하자면, 유니코드 문자열(String)을 바이트코드로 인코딩 해주는 메소드이다.
만약 getBytes()의 인자로 캐릭터셋을 넘기지 않으면 사용자 플랫폼의 기본 charset으로 인코딩 된다.
Encodes this String into a sequence of bytes using the platform's default charset, storing the result into a new byte array.
만약 캐릭터셋을 넘겨주면 해당 캐릭터셋으로 인코딩을 하게 된다.
사용법은 위와 같은데 도대체 이게 왜 필요하고 어디에 사용되는걸까?
여러 자료를 찾던 도중 아래와 같은 내용을 볼 수 있었다.
DB 테이블의 charset이 latin1으로 되어 있을 경우, 한글로 된 정보를 테이블에 그대로 저장할 수 없다. 그대로 저장할 경우 정보가 손실된다.
DB 테이블의 charset이 latin1으로 되어 있을 경우, 한글로 된 정보를 테이블에 그대로 저장할 수 없다. 그대로 저장할 경우 정보가 손실된다.
위와 같은 경우, 테이블에 저장하기 위해서는 한글로 된 정보를 DB 테이블의 charset으로 변경하여 저장하여야 정보가 손실되지 않는다는 말이다. 이걸 코드로 간단히 작성해 보면 아래와 같다.
String name = "김정환"; String encodedName = null; try { encodedName = new String(name.getBytes("utf-8"), "latin1"); } catch (UnsupportedEncodingException e) { // .. exception }
위 코드는
1. getBytes("utf-8")로 "김정환"이라는 이름을 바이트배열로 변환
2. 해당 바이트배열을 가지고 다시 "latin1" 캐릭터셋의 String을 생성하는 과정이다.
이제 이 String을 테이블에 저장하면 된다. 물론 이렇게 저장하면 테이블의 정보는 한글로 표시되지 않는다.
하지만, 정보가 손실된게 아니기 때문에 다시 디코딩을 하면 원래 한글 정보를 찾을수 있다.
String encodedName = "....."; // db에서 가져온 latin1 캐릭터셋의 String String decodedName = null; try { decodedName = new String(encodedName.getBytes("latin1"), "utf-8"); } catch (UnsupportedEncodingException e) { // .. exception }
DB에 저장하기 전 인코딩한 과정을 반대로 하면 디코딩을 할 수 있다. 즉, latin1 캐릭터셋의 바이트배열로 변환 후, 해당 배열을 가지고 utf-8 캐릭터셋의 String을 만든다.
위 내용들을 정리하자면, getBytes() 메소드는 인코딩 / 디코딩 과정에 필요한 바이트배열을 만드는 메소드라 생각할 수 있겠다.
DB 외에 또 무엇을 할 수 있을까? 암호화를 하는데에도 사용할 수 있지 않을까?
'Programming > Java' 카테고리의 다른 글
java.util.Map retainAll() : Map에서 특정 키만 유지 (0) | 2024.07.31 |
---|---|
java.util.Map 과 Map.Entry<K, V> 인터페이스 (0) | 2024.07.30 |
[Java] 이클립스 UTF-8 BOM 제거하기 (0) | 2019.06.27 |
리눅스 정규식 (0) | 2016.12.27 |
JAVA File 삭제 (폴더 안의 파일 모두 삭제) (0) | 2016.12.20 |