참으로 오랜 만에 올리는 글이다.
이번에는 거의 일년도 넘게 골치거리로 남아있던 문제점을 해결한 방법을 기록해본다.
이 에러는 그동안 닷홈 서버에서 해결하지 못했던 한글깨짐의 원인을 제공하는 부분이었는데, DB connection error 구문을 그 동안 꺼놓고 있었던 탓에 발견하지 못한 점도 있고 코딩을 하지 않고 워드프레스를 그저 자체로 이용만 하던 상황에서는 만날 수 조차 없던 것이었기 때문에 이제서야 해결방법을 알 수 있게 된 점도 있다.
근래들어서 는 ‘문자 셋’을 utf-8으로 설정하게 되면 영문이든 한글이든 심지어는 한자인 경우에라도 대부분의 경우에 화면깨짐이 없이 잘 구현되는것이 일반적이지만 몇몇 특수한 경우에는 그 원인을 쉽게 알 수 없는 ‘한글깨짐’ 현상을 만나게 된다.
필자의 경우도 그 중의 한 종류라고도 볼 수 있다.
[ 현 상 ]
DB에서 특정필드를 읽어와서 php 코드의 특정변수와 비교하는 쿼리구문을 실행시킨 것인데..아래와같은 에러 메시지를 만났다.
” Error:?? Illegal mix of collations (utf8_general_ci,IMPLICIT) and (euckr_korean_ci,COERCIBLE) for operation ‘=’ ”
sql 쿼리구분을 출력해보니 에러가 나는 위치에서 한글이 포함되어있었다. 분명히 mySQL DB세팅을 utf8_general_ci 로 되어있고, php 코드도 utf8 로 변환하여 업로드했는데..이런 에러가 뜨는것을 납들할수없었다.
하지만 에러가 발생하는 ‘필드’를 euckr_korean_ci,로 변경하면 에러가 나타나지않는 것으로 봐서는 php 코드 부분에서 한글을 아파치 서버가 euckr_korean_ci 로 해석하는 것이 확실했다.
하지만 문제는 이렇게 두면 코드를 실행한 후에 화면의 한글부분이 모두 깨져 나온다는 것이다. 분명한 것은 현재의 아파치 서버 세팅이 ‘euckr’이므로 ” 어떻게 하면 이것을 ‘utf8’ 으로 바꿀것인가?” 가 관건이다.
과거의 기억을 되살려 보면 닷홈서버의 경우에는 ‘.htaccess’ 셋팅에서도 문자셋에 대한 설정이 있었던 것 같아 그 곳부터 살펴보았다.
<IfModule mod_url.c> checkURL On # ServerEncoding UTF-8 # ClientEncoding euckr </IfModule>
하지만 이건 주석 처리된 것이므로 문제가 없을듯… 하지만 혹시 모르니
ClientEncoding
을
UTF-8
로 바꾸고 주석 처리를 지워 보았다. 역시 별무 소득도 없다.
이제 에러 메시지를 긁어서 구글링 해본다. 수도 없는 내용의 글이 뜬다.
이것들을 열심히 찻아 다니면서 읽어보고 어느 정도 소득을 얻게되었다.
- 아파치 서버 설정 : (httpd.conf 에서)
AddDefaultCharset UTF-8
- PHP 설정 변경 :(php.ini 에서)
default_charset = "UTF-8" output_handler = mb_output_handler [mbstring] mbstring.language = UTF-8 mbstring.internal_encoding = UTF-8 mbstring.http_input = auto mbstring.http_output = UTF-8 mbstring.encoding_translation = On mbstring.detect_order = auto mbstring.substitute_character = none; [PHP_MBSTRING] extension=php_mbstring.dll
- mySQL 설정 변경( my.cnf 파일에서 )
[client] default-character-set = utf8 [mysqld] character-set-client-handshake=FALSE init_connect="SET collation_connection = utf8_general_ci" init_connect="SET NAMES utf8" character-set-server = utf8 collation-server = utf8_general_ci [mysqldump] default-character-set = utf8 [mysql] default-character-set = utf8
- PHP 코드 내부 에서 ( 반드시 모든 파일은 UTF-8로 만들어 저장한다.)
1) HTML 파일 내부에서:
meta http-equiv="Content-Type" content="text/html; charset=UTF-8"
2) XML 파일내부에서 :
xml version="1.0" encoding="UTF-8"
3) css 파일에서 :
@charset "utf-8";
4) 서버에 지정된 문자셋을 무시하고 새로 지정 하는 방법 : php
header("Content-Type: text/html; charset=UTF-8");
5) javascript 에서 :
<script> type="text/javascript" src="path/file.js" charset="utf-8"</script>
하지만 이것들은 대부분 서버를 직접 운용하는 경우에 적용 가능한 것 들이어서 적용해보았지만 대부분이 별무 소득도 없다.
- 마지막 방안
마지막 4) 번의 경우는 그래도 서버세팅을 무시하고 새로 지정하는 방법이므로 내가 시도해 볼 수 있는 것이다.이런 코드를 넣으면 된다고 되어있는데…
내 경우에는 이것으로 해결이 가능했다.
Thanks for the great guide