본문 바로가기

개발

웹페이지 한글 출력,servlet 한글 출력,물음표 표시 해결, 웹 브라우져에 따른 파라미터 처리,오라클 케릭터셋-2

장장 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로

했을때 ​왜 안되는것인가