프리랜서 웹수리천사

반응형

"홈페이지 html php 한글깨짐 특수문자로 깨지는 문제 현상 해결방법, 인코딩 변경"



홈페이지를 운영하다가 보면 예기치않게 한글이 특수문자로 깨지는 경우가 있다

아무것도 수정한게 없는데 깨지는 경우는 그리 많지 않다..

무언가 작업을 했으니 한글이 깨지기 마련이다.

웹천사도 이런 문제를 만나면 쉽게 해결 하지 못할때가 있는데

오늘은 이런 문제를 만나면 쉽게 풀수 있도록 단계별로 점검 포인트를 정리보도록 하자!


우선 용어의 정리와 기본개념 두가지만 짚고 넘어가자


언어셋(캐릭터셋,문자셋) : 

가장 쉬운예로 한글은 조합형과 완성형(집합)이 있다. 

그런데 이것 뿐만 있는게 아니라 유니코드(Unicode, 세계의 모든 문자를 일관되게 다루도록 설계된 표준)화 되지 않는 문자셋까지 포함한다면

한글만 해도 문자셋은 어마하게 많다.


인코딩 :

인코딩이란 단순히 말해 부호화다. 

에디터에 보여지는 텍스트를 약속된 규칙으로 

컴퓨터가 이해하는 언어(부호)로 변환하는 것을 인코딩이라고 한다.



웹문서의 범용하는 한글 인코딩 방식은 utf-8과 euc-kr 이다.

다국어를 지원케 하는 유니코드화 되기 이전 문서타입은 euc-kr로 사용했지만

현재는 호환성 높은 언어셋인 utf-8을 사용한다.


컴퓨터(문자해석기, 브라우져)가 저장된 문서(파일=html,php,jsp,txt 등)를

자동으로 인코딩된 방식으로 출력해주면 좋겠지만

우리가 사용하는 방법은 

인코딩방식을 선언하고 그 선언된 방식으로 파일(문서)을 인코딩(저장)해야만

한글이 깨지지 않고 정상적으로 출력이 된다.


다시말해 선언은 utf로 인코딩(저장)은 euc로

또는 그 반대로 하게 되면 한글은 특수문자처럼 깨져서 출력되게 된다.

한글 깨지는 문제는 웹문서 뿐만아니라 한글을 사용하는 모든 S/W 영역에서 나타날수 있는 현상이다.


자! 그럼 한글이 깨지는 경우에 대해 어디를 짚어야 하는지 조금은 이해가 될것이다.





제일 먼저 한글이 깨질때 가장 쉽게 점검하는 방법은

소스보기를 하라!


소스보기에서 charset 란 문자를 찾아(meta태그내)  <meta charset="utf-8 or euc-kr(대소문자구문안함)"> 이부분에 

언어셋 정의가 되어 있는지 확인하다.


그리고 utf-8, euc-kr 이란 문자를 각각 찾아서 두가지가 혼용되어 있다면 점검할 필요가 있다.

(혼용이 되더라도 인코딩 방식과 선언방식이 동일하다면 문제가 없다)


그 다음 점검포인트는 한글이 깨지는 부분의 웹파일을 찾아 인코딩 방식을 확인해야 한다.

이것이 쉬운일이 아니다.

웹페이지는 수많은 파일들이 include되어 있어 어떤 파일이 문제를 줬는지 확인하기가 어렵다.

실제로 파일의 인코딩 문제일 수도 있고, 문자와 관련된 함수가 문제일 수도 있다.

어떤 파일들이 인쿠르드 되어 있는지 확인 하는 방법은 php의 경우 아래의 함수로 확인이 가능하다.

get_included_files()


하나씩 열어서 인코딩방식을 확인하는수 밖에 없다.

utf-8로 인코딩되야 할 경우 한글이 포함되지 않은 영어만 기록된 파일은 인코딩방식이 utf-8 또는 ansi 둘다 문제가 없다.

ansi 인코딩 방식은 euc-kr, ascii(아스키) 등의 문자셋을 공통으로 인코딩하는 방식이다.

다시말해 euc-kr, 온리 영어, 온리 숫자 ==> ansi 로 인코딩하면 된다.


인코딩방식 확인은 노트패드++(프리웨어) 등의 에디터를 열어서 확인할 수 있다.




인코딩방식 변경은 마찬가지로 에디터를 열어 인코딩메뉴 또는 다른이름으로 저장 할때 형식을 변경 할 수 있다.




인코딩 방식에 모두 이상이 없는데도 한글이 깨진다면??

디비를 확인해 보자. 디비에 있는 content가 실제로 깨져서 저장된 경우도 있다.

정상적으로 사용 중인 홈피에 이런 문제는 거의 없지만

서버를 이전하거나 홈피를 수정하는 과정 중 디비에 임포트를 잘못했거나 내용을 db에 insert할때 잘못되는 경우가 있을 수 있다.

전자의 경우는 해결이 가능하나 후자의 경우는 내용을 되 돌이킬 수가 없다.

원본문서가 있다면 가능하지만 유저들로 부터 입력된 일정한 양식일 경우 지우고 재 입력을 요청하는 수 밖에 없다.


디비에는 정상으로 한글이 입력되어 있으나 웹문서에서는 깨진다..

그렇다면 디비를 읽어오는 함수부분 체크가 필요하다. 

iconv 함수가 반대로 사용되지 않았는지? 

또는 사용해야 하는데 사용되지 않았는지?

문자를 자르는 부분에 대해서 함수가 잘못 적용되었는지?


위의 방법으로 대부분 해결이 가능할 거라 생각하고..






기타 제한적으로 한글이 깨지는 경우가 있다.


팝업창에서 한글이 깨지는 경우, 자바스크립트 경고창에서 한글이 깨지는 경우

이런 경우에는 문서가 기존 웹페이지에 포함되지 않고 새로운 창이 열리기 때문에

인코딩 방식을 문서 첫부분에 정의 해줘야 한다.

<meta charset="utf-8 or euc-kr(대소문자구문안함)"> or

<?php header("Content-Type: text/html; charset=UTF-8"); ?>




게시판의 카테고리가 한글로 되어 있는 경우 브라우져에 따라서 한글이 깨진다.

이런경우 url로 한글을 전송하는 함수인 urlencode 를 꼭 사용해야 한다.




기타 css 파일 최상단에 @charset "utf-8"; 을 선언해줘야 한다.







웹천사가 경험했던 아주 특이한 케이스는

반대로 설정해야 해결 되는 경우도 있었다.

이건 혼란을 야기할 수 있는 문제라 일반적인 환경에서 생략하기를 바라고

웹서버 아파치 설정이 잘못되어 있거나, db 언어셋 설정이 잘못되어 있는 경우

선언방식과 인코딩 방식을 반대로 했을때 해결된 경우도 있다.

이건 원천적으로 서버설정을 변경해야 한다.


이상의 방법으로 해결이 안되는 경우는 유지보수 영역임을 고려해 보시기 바랍니다!!




참고로 euc-kr 홈페이지 --> utf-8 홈피로 변경해야 할 

모든 문서의 인코딩 방식을 변경해야 한다.


이럴때 사용하는 유틸리티가 RedUTF8.exe 이다.

RedUTF8 을 검색해 보면 파일을 찾을 수 있다.


옵션 설명 :

상위폴더 포함 <- 이건 이름이 좀 이상한데 아무튼 여기를 체크하면 하위폴더까지 적용된다. 체크하지 않으면 선택한 폴더만 적용한다.

UTF-8 확인 후 변환 <- 이건 오래돼서 기억이 가물가물한데.. xp에서는 확인 절차가 있었던것 같기도 하고.. win7 에서는 이옵션은 무시다. 체크 또는 해제 아무런 변화가 없다.

UTF8 Incode 이 버튼은 ANSI -> UTF-8 로 변환한다

UTF8 Decode 이 버튼은 UTF-8 -> ANSI 로 변환한다.


주의사항! 꼭 원본 파일을 백업 받고 클릭하자!!







반응형
신일 리모컨 이동식 에어컨 SMA-D850SI [4개월]프롬바이오 관절연골엔 보스웰리아(850mg*30정*8박스), 단품, 단품