본문 바로가기

Programming/etc

[java, encoding] database와 구축된 application간에 character encoding이 다르면?

깨지죠 -_-

database에 dbms 툴을 이용해서 접근한 후에 select했을 때에

한글이 나오는데 왜 내 어플리케이션(웹이건 뭐건) 에서만 유독 한글이 깨질까?

네. 제목과 같은 이유입니다.


그렇다면 그냥 gg 쳐야할까요?

database 내의 data를 encoding을 다르게 해주는 방법이 있으나 ..

뭐.. 검색 좀 해보니 비추라고 나오네요.

(data가 얼마 없거나 테스트 과정이라면 당연히 바꿔야겠죠!!!)


그래서 java의 String 생성자중에 기특한 녀석이 있습니다.

우선 어떤 녀석인지를 알기 이전에

http://blog.naver.com/anabaral/130043451093

여기에서 8859_1 라는 앞으로 소개할 byte 형식을 이해하시길 바랍니다~

(뭐 몰라도 크게 상관은 없을 수 있습니다만...?? ㅎㅎ;;)


위 블로그에서 보셨듯이 8859_? 라는 것은 일종의 character set을 byte 형태로 변환할 때에 쓰입니다.

(아 뭐라고 적절한 표현이 생각나질 않네요 -_-;;; 문학책 손놓은지 몇개월됐더니...에효..)


자, 그럼 8859_1 이란 것은 String data를 byte 형태로 변환할 때에 쓰인다는 것은 알았구요.

그럼 character encoding이 다른 database로부터 data를 불러온 application이 사람의 눈에

같게 보이게 하려면 어떻게 해야할까요? 서론이 길었네요;;


앞에서 알려드렸듯이 String의 생성자와 8859_1을 이용하시면 됩니다.

우선 data를 byte 형태로 불러와야 합니다.

data.getBytes("8859_1");

위의 메소드를 통해 가져온 byte형태의 data, 그리고 원하시는 encoding 표기명을 parameter로

String 을 생성해주면 됩니다.

예로써, 아래는 utf-8로 저장되어있는 오라클의 data를 euc-kr 로 구현된 application에서 경우입니다.

(저장된 data가 한글이라는 가정아래)

new data = resultSet.getString("form_UTF8_encoding_oracle_data");

System.out.println(data);       // 외계어가 나옵니다.

data = new String(data.getBytes("8859_1"), "euc-kr");

System.out.println(data);       // 저장되어있는 한글 data가 나옵니다.


뭐 길게 적을 내용은 아니었는데;;; 길었네요 -_-;;;

8859_1 의 비밀을 이해하시기 위해서라면 꼭 상위의 저 링크를 참조하시길 바랍니다~