본문 바로가기
Java/이론 및 용어

[JSP] 입출력 시의 문자 인코딩

by tokkiC 2022. 5. 17.

그냥 서블릿 작성을 작성할 시 한글을 그대로 출력하도록 하면 글자가 깨진다

이는 프로그램의 기본 언어 인코딩이 한글을 인식할수있는 UTF-8 이 아니기 때문이다

영어권의 인코딩 방식이 기본인데 이는 1byte 당 문자 1개로 매칭되어 영어를 표현하기 때문이다

1바이트가 차면 바로 옛다 영어 하나다 하고 보내는 것이다

저번에 했던 아스키 코드가 여기서 쓰인다.

bit 가 4개 모여 nibble 이라고 하고

2개의 nibble 이 모여 (= 8개의 bit가 모여) 1byte 를 이룬다

4개의 bit가 모인 nibble 은 16개의 경우의 수를 가질수있는데 이걸 이용해서

16진수로 표기를 할수있고, 16진수로 표현 시 0x를 앞에 붙이고 0부터 f 까지 16가지의 경우를 표기한다

1byte 는 2nibble 이기에, 1byte는 0x00부터 0xff 까지의 수를 가지게 되는 것이다

영문자 하나를 표현하는데에는 1byte가 필요하지만, 그외 한글 등의 외국어는 보통 2byte가 필요하다.

인코딩을 안하고 영어권 문자 인코딩 방식으로 보내면 1byte당 하나의 문자라고 인식하지만

내가 쓴 한글은 2byte당 하나의 문자로 매칭시켜야만 깨지지 않고 온전히 데이터가 담기기 때문에

항상 한글을 쓰는 경우나 영어 외의 문자가 쓰이거나 쓰일 수 있는 경우 문자의 인코딩을 유의해야한다

웹에서 요청받을때, 그리고 요청에 응답할때 2가지 경우 모두 UTF-8로 인코딩하겠다는 코드를 써서 작성해야

한글이 깨지지않고 제대로 동작될 것이다

톰캣 환경설정을 통해 기본 문자 인코디을 설정가능 하지만 여러명이 쓰는 서버일 경우 설정을 바꾸면

여러명의 프로젝트에게 영향이 가므로 톰캣 환경설정 변경보다는 아래의 방법을 사용하길 추천한다 


서블릿에서의 입출력 시 한글 인코딩을 위해서 아래의 코드를 서비스 메소드 안에 넣는다

        request.setCharacterEncoding("UTF-8");                  //  요청해 받아 올 문자를 인코딩! UTF-8 로!
        response.setCharacterEncoding("UTF-8");                    //  응답해 보낼 문자를 문자를 인코딩! UTF-8 로!
        response.setContentType("text/html; charset=UTF-8");    //  브라우저 마다 기본 인코딩 문자코드가 다르므로
                                                           // 클라이언트의 브라우저에게 UTF-8 을 사용해서 읽으라고 전달!

 

request.setCharacterEncoding("UTF-8"); 요청해 받아 올 문자를 인코딩! UTF-8 로!
response.setCharacterEncoding("UTF-8"); 응답해 보낼 문자를 문자를 인코딩! UTF-8 로!
response.setContentType("text/html; charset=UTF-8"); 브라우저 마다 기본 인코딩 문자코드가 다르므로 클라이언트가 사용하는 브라우저에게 UTF-8 을 사용해 읽으라고 전달!

문자 인코딩을 안해서 이렇게 문자가 깨지는 경우를 어릴때 많이 봤었지... 근데   저 짤에서 NULL terminate 가 뭐지? 찾아보고 다음에 글에서 정리해야겠다

댓글