구리의 창고

Locale, Apache, Putty 인코딩 - 문자가 깨지는 경우 본문

Web

Locale, Apache, Putty 인코딩 - 문자가 깨지는 경우

구리z 2012. 2. 6. 13:41
웹 작업을 하다보면 문자열이 깨지는 경우가 많다.

vim에 깨지는 경우, 웹에서 깨지는 경우, meta tag에 있는 charset을 따라가지 않는 경우 등 다양하다.

흔히 EUC-KR과 UTF-8 문제이다.

리눅스 서버에서 작업을 한다는 가정하에 해결방법을 적어보겠다.

우리의 목표는 UTF-8로 맞추는 것이다.

* 터미널 인코딩 맞추기
1) locale 명령어를 이용해 서버 인코딩을 확인한다.



2) 만약에 ko_KR.EUC-KR 로 돼있다면 vi /etc/sysconfig/i18n 에서 아래와 같이 바꿔준다.

LANG="ko_KR.UTF-8"

SUPPORTED="en_US.UTF-8:en_US:en:ko_KR.UTF-8:ko_KR.eucKR:ko_KR:ko"

SYSFONT="latarcyrheb-sun16"


3) 2번과정을 했음에도 불구하고 문자열이 깨지는 경우가 있다.
계정마다 존재하는 ~/.bashrc 파일에서 강제로 export를 해주는 경우이다.
vi ~/.bashrc 를 통해 export LANG=ko_KR.EUC-KR 과 같은 구문을 삭제해준다.
저장 후, source ~/.bashrc 를 통해 다시 로드해준다.

* PUTTY 설정
1) 푸티 제목표시줄 우클릭 후 설정변경(Change Settings)를 클릭한다.

2) Window > Translation > Remote character set 을 UTF-8로 바꿔준다.
(한글판: 창 > 변환 > 수신한 데이터를 이 문자셋으로 가정)
 
3) 그리고 한글폰트가 지원되는 폰트를 선택해야한다.
Window > Appearance > Font settings > Change...
(한글판: 창 > 모양 > 글꼴 설정 > Change...)

4) 적용을 누른다.

위 과정을 했음에도 불구하고 ls 명령어로 목록을 조회했는데 파일명이 물음표나 깨져서 나올 수 있다.

* 파일 이름 인코딩 설정
1) 파일이름과 파일내용 인코딩은 별개이다.

2) convmv 유틸을 이용해서 파일 인코딩을 바꿔준다.

convmv -f euc-kr -t utf-8 {filename} > {convertedFilename}


여기까지 했으면 터미널에서(vim 내용이 아닌) 나오는 메시지는 모두 제대로 나올 것이다.
하지만, 아직 웹이나 vim 으로 내용 확인 시 파일 내용이 깨지는 것을 볼 수 있을지도 모른다.
그런 상황에선 계속.... 아래로

* 파일 내용 인코딩 설정
1) 파일 내용 인코딩은 iconv 명령어를 통해 변경 할 수 있다.
주의!! {filename}과 {convertedFilename}이 같으면 내용이 날아간다.

iconv -f euc-kr -t utf-8 {filename} > {convertedFilename}


2) 여기까지 제대로 따라했다면 UTF-8로 출력되는 vim 화면을 볼 수있다.
하지만 아직도 웹페지는 깨져 나올 수 있다.

* Meta tag에 charset 설정
1) 웹 페이지 파일 중 head 를 포함하는 파일을 연다.

2) <head> 바로 밑 <title></title> 위 사이에 아래와 같이 meta tag를 삽입한다.

<html>

<head>

<meta http-equiv="content-type" content="text/html; charset=utf-8">

<title>제목 없음</title>


3) 웹페이지를 확인하여 제대로 출력됐는지 확인한다.

4) 만약 이렇게 했는데 깨진다면, 웹브라우저 인코딩이 어떻게 돼있는지 확인한다.
확인 방법은, 우클릭 후 인코딩 항목을 찾아서 UTF-8로 강제 설정해본다.

5) 4번 과정 후, 제대로 출력된다면 아파치 설정이 이상한 것이다.

6) 더 확실 한 것은 웹브라우저의 디버깅 기능을 이용해서 아래와 같이 헤더를 확인하는 것이다.
아래는 크롬의 요소 검사 > Network 기능을 이용해 확인했다.
Firefox의 경우는 Firebug를 사용하면 확인 할 수 있다.
Accept-Charset에 euck-kr나 cp949가 있다면, 이를 변경해줘야 한다.



* Apache 설정
1) 아파치 설정은 서버마다 다르겠지만, 보통 아래 경로에 있다.
/etc/httpd/conf/httpd.conf
/etc/apache2/conf/httpd.conf


2) 위 파일을 열어서 AddDefaultCharset을 검색한다.

3) 그 후 AddDefaultCharset UTF-8 로 세팅을 해주고 아파치를 재시작한다.

아마 여기까지 했으면 제대로 출력 될거라 생각한다. 
그래도 추가로 문자열이 깨진다!! 하면 Database에서 읽어오는 문자열이 UTF-8인지 확인해봐야한다.
MySQL의 경우, 데이터베이스, 테이블, 컬럼에서 사용하는 charset이 각각 다르다.
전부 체크해 utf8_general_ci로 바꿔주면 된다.

만약 EUC-KR 로 서버를 바꾸고 싶다면 위 과정을 전부 EUC-KR로 바꿔서 해주면된다. 
Comments