Wordpress를 사용하다보면 UTF-8과 EUC-KR로 인코딩된 블로그간에 트랙백을 받거나 보낼때 글씨가 깨지게 된다. 이 hack은 다르게 인코딩된 블로그 사이의 트랙백이 깨지지 않게 하기 위한 것이다. UTF-8로 인코딩된 Wordpress 2.0 버전을 기준으로 작성되었다.
새로운 버전의 워드프레스가 나왔을 때 대처하는 요령
이 포스트에 새로운 버전에 대한 파일이 올라오지 않았을 경우 예전 버전용 파일을 업그레이드한 워드프레스에 덧씌우지 마세요. wp-trackback.php 파일과 functions.php 파일만 예전 버전이므로 제대로 작동할리 만무할뿐 아니라 치명적인 오류를 유발할 수 있습니다. 새버전의 파일에서 포스트의 내용에 나온 부분만 수동으로 고치는 방법만이 안전합니다. 이 포스트의 소스를 Copy해서 에디터에 Paste 할 경우에 작은따옴표(’)를 수정하셔야 합니다. mbstring 모듈 사용자는 wp-trackback.php 파일의 $charset에 EUC-KR을 추가함으로써 간단히 받는 트랙백 문제를 해결할 수 있습니다.
다운로드
Wordpress 1.5x용 : 링크
Wordpress 2.0용 : 다운
Wordpress 2.0용 자르는 문제 해결 통합(mbstring사용시 권장) : 다운 설명
Wordpress 2.0.1용 : 다운
Wordpress 2.0.2용 : 다운
Wordpress 2.0.3용 : 다운
Wordpress 2.0.4용 : 다운
Wordpress 2.0.5용 : 다운
Wordpress 2.0.6용 : 다운
Wordpress 2.0.7용 : 다운
Wordpress 2.1 이상 : 링크
다른 해결방법
영팔님이 약간의 hack이 필요한 플러그인을 만드셨습니다.
워드프레스 EUC-KR 트랙백 플러그인(HACK)
정태영님이 받는 트랙백용 플러그인을 만드셨습니다.
Korean Trackback Plugin
사용방법
받는 트랙백은 자동으로 변환된다.
2.0용 버전에서는 보내는 트랙백 사용방법이 바뀌었다. 트랙백 받는 블로그가 내 블로그와 다른 인코딩을 사용할 경우 트랙백 보내는 주소 앞에 !를 붙여서 사용한다. Send trackbacks to: 의 트랙백 주소 적는 곳에 !http://트랙백주소 를 넣는다.
예) !http://www.windlike.net/blog/236/trackback/
데이타베이스에도 인코딩변환되어 나간 트랙백 주소는 !http://…형태로 !이 붙어서 남는다.
같은 인코딩일 경우 그냥 트랙백 주소만 적는다. !를 붙여서 인코딩을 변환하면 오히려 깨진다.
예) http://www.windlike.net/blog/236/trackback/
상대의 인코딩을 알아내는 방법은 브라우져의 보기 - 인코딩 메뉴를 보면 알 수 있다.
주의사항
적용대상 :
- PHP 4.0.6 이상
- mbstring 모듈이나 iconv 모듈 둘 중 하나가 설치되어 있어야 함
확인방법 :
- 직접 호스팅 업체에 문의
- 다음 코드를 에디터를 이용하여 test.php로 저장한 후 브라우져에서 실행한다(미리 작성된 파일 : 다운)
<?php
echo 'PHP version: ' . phpversion() . '<br />';
if ( function_exists('mb_convert_encoding') ) echo 'mbstring OK!<br />';
else echo 'mbstring fail..<br />';
if ( function_exists('iconv') ) echo 'iconv OK!<br />';
else echo 'iconv fail..<br />';
?>
mbstring OK! 가 나오면 mbstring 모듈을 이용할 수 있다(둘 다 OK일 경우 이방법을 권장)
iconv OK! 가 나오면 iconv 모듈을 이용할 수 있다(mbstring fail 일 경우 이 방법으로 한다)
둘다 fail이면 호스팅 업체에서 둘 중 하나를 설치해 줄때까지 불가능하다
라이센스
Wordpress가 GPL이기 때문에 이 hack 역시 GPL을 따른다. 수정 및 재배포 모두 가능함.
지금까지 도움주신 분들
아거님, 입명이님, H.Moon님, BluedSnow님, 지윤님, UNFGroup님, unfusion님, 영팔님
받는 트랙백핑 문제 해결(mbstring)
/wp-trackback.php를 열어 $charset에 EUC-KR을 추가한다
$charset = 'ASCII, UTF-8, EUC-KR, ISO-8859-1, JIS, EUC-JP, SJIS’;
mbstring 모듈을 사용할 수 있을 경우 직접 수정해서 사용하면 편리하다.
받는 트랙백핑 문제 해결(iconv)
정규식을 이용한 is_utf8 함수를 만들어 UTF-8인지 확인한 후 iconv 함수로 인코딩을 변환한다.
/wp-trackback.php를 열어 // trackback is done by a POST 위에 아래의 코드를 추가한다. 이는 이해를 돕기 위치이므로 굳이 이곳이 아니라도 적당한 곳에 추가하면 된다.
// Returns true if $string is valid UTF-8 and false otherwise.
function is_utf8($string) {
return preg_match('%^(?:
[\x09\x0A\x0D\x20-\x7E] # ASCII
| [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte
| \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs
| [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte
| \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates
| \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3
| [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15
| \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16
)*$%xs’, $string);
} // function is_utf8
위 방법은 워드프레스 기본 함수인 seems_utf8()를 사용할 수 있으므로 삭제(참고 : http://082net.com/2006/769/euckr-trackback-hack/)
/wp-trackback.php를 열어
if ( function_exists('mb_convert_encoding') ) {
$title = mb_convert_encoding($title, get_settings('blog_charset'), $charset);
$excerpt = mb_convert_encoding($excerpt, get_settings('blog_charset'), $charset);
$blog_name = mb_convert_encoding($blog_name, get_settings('blog_charset'), $charset);
}
아래에 다음을 추가한다
else if ( function_exists('iconv') ) {
if ( !seems_utf8($title) )
$title = iconv('EUC-KR', 'UTF-8', $title);
if ( !seems_utf8($excerpt) )
$excerpt = iconv('EUC-KR', 'UTF-8', $excerpt);
if ( !seems_utf8($blog_name) )
$blog_name = iconv('EUC-KR', 'UTF-8', $blog_name);
}
보내는 트랙백핑 문제 해결
/wp-includes/functions.php를 열어 trackback 함수를 찾는다
function trackback($trackback_url, $title, $excerpt, $ID) {
global $wpdb, $wp_version;
if ( empty($trackback_url) )
return;
$title = urlencode($title);
$excerpt = urlencode($excerpt);
$blog_name = urlencode(get_settings(’blogname’));
$tb_url = $trackback_url;
를 아래와 같이 바꾼다(굵은 글자가 추가되거나 바뀌는 부분)
$tb_url = $trackback_url;이 위치를 바꾸는 것과
$blog_name = get_settings(’blogname’);이 두부분으로 나뉘어 수정되는것 주의
function trackback($trackback_url, $title, $excerpt, $ID) {
global $wpdb, $wp_version;
if ( empty($trackback_url) )
return;
$blog_name = get_settings(’blogname’);
$tb_url = $trackback_url;
if($trackback_url[0] == ‘!’) {
$trackback_url = substr($trackback_url, 1);
if ( function_exists(’mb_convert_encoding’) ) {
$title = mb_convert_encoding($title, ‘EUC-KR’, ‘UTF-8′);
$excerpt = mb_convert_encoding($excerpt, ‘EUC-KR’, ‘UTF-8′);
$blog_name = mb_convert_encoding($blog_name, ‘EUC-KR’, ‘UTF-8′);
}
else if ( function_exists(’iconv’) ) {
$title = iconv(’UTF-8′, ‘EUC-KR’, $title);
$excerpt = iconv(’UTF-8′, ‘EUC-KR’, $excerpt);
$blog_name = iconv(’UTF-8′, ‘EUC-KR’, $blog_name);
}
}
$title = urlencode($title);
$excerpt = urlencode($excerpt);
$blog_name = urlencode($blog_name);