장장 4일에 걸쳐서 안되던게 이제서 해결이..
웹 프로그래밍을 하면 참 할게 많구나 하는 생각이 든다.
내가 맡은 역활은 서버단을 구축하는건데
데이터 - 서버(가공) - 디비(추출) - 서버(가공) - 웹
여기서 (서버-디비-서버)를 맡았다.
하다보니 안되는 부분이 있었는데 한글로 출력하는 부분이었다.
일단 데이터를 받는 부분 부터 웹브라우져의 인코딩, 서블릿 소스의 인코딩,
디비와 인코딩 등 여러 인코딩 상황에 있었는데 하나만 해결해자라는
생각 때문에 나중보니 어디서 부터 수정해야할지 감이 안잡혀서
다시 이걸 다 고치는데 힘들었다............
일단 브라우져마다 인코딩이 다른것은 1편에서 언급했고, 톰켓은 두가지
방법을 이용해서 get방식으로 전달된 파라미터를 읽을 때 사용할 캐릭터 셋을
지정할 수 있다.
1. server.xml 파일에서 <Connector>의 useBodyEncodingForURI 속성의 값을 true로 지정하는 방법.
2. server.xml 파일에서 <Connector>의 URIEncoding 속성의 값으로 원하는 캐릭터 셋을 지정하는 방법.
첫번째 방법을 쓰면 setEncoding메서드를 이용해서 설정하는것이 가능해진다.
두번째 방법은 URIEncoding = "euc-kr"로 이용해서 미리 케릭터 셋을
지정하는 방법이다.
원래 이렇게
new String(request.getParameter(파라미터).getBytes("8859_1"),"euc-kr");
한글을 받아왔었는데 request.getParameter(파라미터) 이것만 써도 그냥
받을 수 있다.
------------------------------------------------------------------------
다음에는 자꾸 한글이 안나와서 디비에서 나올때 어떤 케릭터 셋으로
나오는지 확인 하려고 쓴 쿼리이다. (오라클)
select * from DEPARTMENT;
SELECT *
FROM sys.props$
WHERE name='NLS_CHARACTERSET';
이러면 디비의 케릭터 셋을 확인 가능하다.
------------------------------------------------------------------------
이래도 한글이 나오지 않았다.
내가 해주고 싶은것은 gson을 사용해서 자료구조와 그 안에 속한 클래스를
String 형식으로 웹에 뿌려주는것이다.
여기서 문제점은 소스에 System.out.println 으로 하면 톰켓 콘솔창에는
한글로 잘 나온다. 그런데 response.getWriter().write 이걸로
웹 브라우져로 띄우면 한글이 다 깨져서 나왔다.
http://helloworld.naver.com/helloworld/76650 검색하다가
여기에 있는 소스를 참조했는데
String hangul =
"한글"
;
String[] encodings =
new
String[] {
"EUC-KR"
,
"UTF-8"
,
"ISO8859-1"
};
for
(String encoding1 : encodings) {
String encoded = URLEncoder.encode(hangul, encoding1);
System.out.println(encoded);
System.out.print(
"\t"
);
for
(String encoding2 : encodings) {
String decoded = URLDecoder.decode(encoded, encoding2);
System.out.print(decoded +
"\t\t"
);
}
System.out.println(
"\n"
);
}
여기서 String hangul = "한글"; 대신 내가 바꾸고 싶은 string을 넣고
해보니깐 맞는 형식이 하나 나왔다.
이 소스는 '한글'을 일단 세가지 언어 형식으로 인코딩 하고
인코딩 한것을 또 세가지 방법으로 디코딩 한다.
(예시)
euc-kr(인코딩) -> euc-kr(디코딩) 정상값
-> UTF-8(디코딩)
-> ISO8859-1(디코딩)
UTF-8(인코딩) -> euc-kr(디코딩)
-> UTF-8(디코딩) 정상값
-> ISO8859-1(디코딩)
ISO8859-1(인코딩) -> euc-kr(디코딩)
-> UTF-8(디코딩)
-> ISO8859-1(디코딩)
이걸 참조해서 해봤더니 인코딩을 euc-kr로 하고 디코딩을 ISO8859-1로
웹브라우져는 한국어로 인코딩 설정에 맞춰놓으니 한글이 잘나온다.
다른것은 다 안나왔고 웹브라우져 인코딩 설정도 다 바꿔봤는데 안되었다.
생각해보니 저번에 포스팅할때 웹은 기본으로 ISO8859-1 값이고
내가 처음만든 string값은 한글 값이라 이렇게 된것 같다.
-------------------------------------------------------------
궁금점
1. 자료구조형을 처음에 gson으로 변화시켜서 받은값은 무슨값인가
위 소스예제는 한글도 utf-8로 변환이 되었는데 내가 한건 한글인데
왜 변환이 안될까...
2. 디코딩할때 ISO8859-1으로 했는데 웹으로 디코딩을 할때는 무조건 iso
형식으로 해야하는건가. setCharacter로 해서 utf-8로 하고 디코딩도 utf-8로
했을때 왜 안되는것인가
'개발' 카테고리의 다른 글
서블릿으로 Dispatchservlet 역할 구현하기-1 (0) | 2016.07.01 |
---|---|
Http 기본 메소드 제한 (0) | 2016.07.01 |
톰켓 한글 setCharacterEncoding 안되는 이유, jsp,servlet 한글 인코딩 문제, 웹 브라우져에 따른 파라미터 처리방식-1 (0) | 2015.05.10 |
자바 리플렉션 사용법 , Reflection (0) | 2015.05.10 |
스프링 다국어 처리. spring Locale setting. (0) | 2015.05.10 |