java에서 오라클을 select 쿼리를 실행해야 하는 상황에서 한글의 경우 문자가 깨지는 현상이 발생하는 경우가 있다.
POST방식을 기준으로
request.setCharaterEncoding("euc-kr");
선언.
을 getParameter 등을 하기 전에 선언 해주면 대부분 해결된다.
이게 안 될 경우, 보통 model이나 controller 단에서 getParameter 등을 쓰는 경우가 있어서 그 전에 선언해주면 된다.- Oracle (db) 의 인코딩이 한글을 지원 안 할 경우.
이 경우는 인코딩 변환을 수동으로 해줘야 하는데 일단 where절에 한글 값을 주니 값이 아예 나오질 않았다. 그래서 where 절에 자바 스트링 값을 넣어줄 때
이런 식으로 인코딩을 변환한 값을 where 절 조건에 넣어주니 되었다.string afterStr = new String(beforeStr.getBytes("euc-kr"), "8859\_1");
- 이 부분을 설명하자면 브라우저에 한글이 나오는 경우는 보통 인코딩이 euc-kr 이나 ksc5601 인데, 한글이 잘 나오는 스트링의 인코딩이 euc-kr 가정하고, euc-kr로 디코딩한 byte 값을 8859_1로 인코딩해서 db에 넣어주는 것이다.
- 8859_1은 영어 기준으로 기본 인코딩이라 생각하면 될 듯 (사실 정확히는 모름)
- 보통 이 경우 db 인코딩 문제이므로 대부분 db의 인코딩을 바꾸는 경우가 많은 것 같으나 그렇게 할 수 없는 경우 아래와 같이 해보자.
같은 원리로 select 해서 rs.getString(idx) 등을 한 값을 8859_1로 바이트 형태로 디코딩한 뒤, euc-kr로 인코딩해서 출력해주면 될 것이다.
string afterStr = new String(beforeStr.getBytes("8859_1"), "euc-kr");
그런데 잘 안 되는 경우가 있다.
내 경우엔 euc-kr로 인코딩했을 때 한글이 이미 ??? 로 나왔다. 대부분 ???의 경우 한글이 2번 이상 인코딩 됐을 때 자주 나오는 현상이다. 그래서 아예 인코딩하지 않고 select한 것을 바로 출력해보았는데 역시나 ??? 로만 나왔다.
삽질하다 해결했는데, db에서 값을 가져올 때 getSring 을 사용하니 java 기본 string 인코딩으로 인코딩이 되어서 그런 것으로 추정된다. 따라서 getBytes 로 바이트 배열을 받을 것을 euc-kr로 인코딩하여 해결했다.
string str = new String(rs.getBytes(), "euc-kr");
이렇게 하니 잘 나온다...
삽질하다보니 인코딩과 byte 에 대해 공부할 수 있는 계기가 된 것 같다.
'Programming > Tip&Informaion' 카테고리의 다른 글
[js] 디버깅 팁 (0) | 2019.12.03 |
---|---|
[asp.net/mssql] column_name 은(는) Table명 테이블의 DataColumn 또는 DataRelation이 아닙니다. 오류 (0) | 2019.10.09 |
docker container에서 react-native 실행하기 (안드로이드) (0) | 2018.12.23 |
[APS.NET] 구성된 개발 웹 서버에 연결할 수 없습니다. (0) | 2018.10.16 |
[python] 반복문 index 수정하기 (2) | 2018.07.08 |