워드프레스 트랙백핑 인코딩 문제 해결

WordPress를 사용하다보면 UTF-8과 EUC-KR로 인코딩된 블로그간에 트랙백을 받거나 보낼때 글씨가 깨지게 된다. 이 hack은 다르게 인코딩된 블로그 사이의 트랙백이 깨지지 않게 하기 위한 것이다. WordPress 1.5 버전을 기준으로 작성되었다.

2.0 버전

새로 포스트를 작성하였습니다
http://www.windlike.net/blog/236/
2005.12.27 15:57

1.5.2 버전(UTF-8 전용) TE

unfusion님이 SE버전에서 트랙백이 깨지는 현상에 대해 보고해 주셨습니다. 여러가지 테스트 결과 트랙백 hack의 문제가 아닌 워드프레스 자체의 결함으로 밝혀졌습니다. 워드프레스에서 트랙백을 보낼때 substr이란 함수로 포스트의 내용중에서 253바이트를 자르고 …을 더해서 보내게 됩니다. 1바이트의 문자일때는 상관이 없는데 UTF-8같은 멀티바이트의 문자에선 글자 중간을 자르게 되는 경우도 발생합니다. 그래서 마지막 문자는 깨진 상태로 보내지는데 트랙백을 받는 쪽에서는 그냥 마지막 한글자만 ?로 나오게 될 뿐입니다. 그렇지만 워드프레스는 mb_convert_encoding이란 함수를 통해 자체적으로 트랙백의 인코딩을 변환합니다. 마지막 깨진 문자때문에 워드프레스는 이 트랙백을 UTF-8이 아닌것으로 인식하고 UTF-8로 재변환을 하게 됩니다. 그래서 결과적으로 트랙백이 깨지게 됩니다.

이 문제를 해결하기 위해 여러가지 방안을 생각했습니다. 기왕이면 워드프레스를 가장 조금 고치고 원래의 코드를 살릴 수 있는 방안. 그리고 버그보고를 통해 정식으로 패치될 수 있는 방안. 다른 블로그툴에서 보낼때 깨져서 들어오는 경우에 대비하기 위해선 받는 쪽에서 수정하는게 좋습니다. 하지만 근본적으로 문제를 해결하는 방법이 아닌데다가 기존 소스의 깔끔함을 해치는 방법이라 보내는 쪽에서 해결하는 방법을 택했습니다. 보내는 쪽을 고치는 방법의 또하나의 장점은 만약 다음 버전에서 이 버그가 수정이 되지 않더라도 이 hack을 쓰지 않은 블로그에 보낼때도 깨지지 않는다는 점입니다.
이 hack은 mbstring 모듈을 설치한 블로그에서만 작동됩니다. 만약 설치가 되지 않았다면 hack을 하지 않은 상태와 같이 작동합니다. mbstring 모듈이 설치가 안되었을 경우 부득이한 경우가 아니라면 호스팅업체에 설치 요청을 할 것을 권장합니다. 워드프레스의 자체의 트랙백 변환은 mbstring에서만 작동하고 제가 만든 트랙백 변환은 iconv에서도 작동하지만 mbstring에서 보다 안정적으로 작동합니다.

만약 mb_strcut 함수를 사용할 수 있는 경우 이 함수를 이용하여 글자를 253바이트 이내에서 자른다. mb_strcut과 substr의 차이점은 mb_strcut은 글자를 인코딩이 깨지지 않게 잘라준다.

/wp-includes/functions.php를 열어 do_trackback함수 내의

$excerpt = substr($excerpt, 0, 252) . '...';

를 아래와 같이 바꾼다

if ( function_exists('mb_strcut') )
$excerpt = mb_strcut($excerpt, 0, 252, get_settings('blog_charset')) . '...';
else $excerpt = substr($excerpt, 0, 252) . '...';

새로 포스트를 열어서 쓰려다 트랙백 변환에 관련된 내용이라 이 포스트에 추가합니다.
1.5.2 SE버전에 위에 있는 새로운 hack을 추가한 1.5.2 TE버전 : 다운로드
2005.9.2 05:16

1.5.2 버전(UTF-8 전용) SE

H.Moon님이 코멘트로 트랙백 hack이 ecto에서 문제를 일으킨다고 알려주셨습니다. 제가 default parameter에 대한 착각을 해서 생긴 문제입니다. 선언된 함수의 parameter보다 호출될 때의 parameter가 적을때 자동으로 부족한 parameter에 null값이 들어간다고 착각을 했습니다. 그래서 function overloading을 하지 않아도 hack을 한 후에도 기존의 함수와 새로 수정한 함수를 모두 쓸수 있다고 생각했는데 default parameter를 사용하려면 선언할때 미리 값을 주어야 합니다. 수정된 부분은 do_trackbakcs함수와 trackback함수의 인코딩관련 parameter에 디폴트로 null값을 주었습니다. 즉 다른 프로그램 또는 워드프레스 내에서 기존의 함수를 그대로 사용하게 될 경우에도 선언된 것보다 호출할 때의 parameter부족때문에 에러를 내지 않습니다. 아래 버전에서 다른 문제점은 보고되지 않았으므로 보통의 경우 굳이 이 버전으로 바꾸실 필요는 없습니다. 하지만 ecto같은 블로깅툴이나 다른 프로그램에 연동해 사용할 경우 필수이며 혹시모를 문제에 대비해 이 버전으로 바꾸실 것을 권장합니다.
다운로드
2005.8.29 03:25

1.5.2 버전(UTF-8 전용)

UNFGroup에서의 트랙백을 보니 워드프레스 1.5.2 버젼이 나왔더군요. 직접 비교해보니 트랙백 내용과 같이 1.5.1.3 버전에서는 post.php만 바뀌었습니다. 놀다보니 방학은 끝나가고.. 플러그인은 아직 손도 안 댔는데..
다운로드
2005.8.15 15:51

1.5.1.3 버전(UTF-8 전용)

심심하다 싶으면 새버전이 나오는 군요.. 이제 방학도 했으니 아예 플러그인으로 만들어봐야 겠습니다. 일단은 좀 놀다가..
다운로드
2005.7.5 14:47

1.5.1.2 버전(UTF-8 전용)

WordPress 1.5.1.1 버전과 동일합니다. 1.5.1.1 버전용을 받아 사용하세요.
Security Update의 내용만 보고 트랙백 패치파일엔 변화가 없겠구나 했는데 지윤님의 트랙백을 보고 에디터로 직접 비교해보니 /wp-includes/functions.php에 한줄이 추가되었습니다.
다운로드
2005.5.29 21:36

1.5.1.1 버전(UTF-8 전용)

WordPress 1.5.1.1 버전용으로 mbstring과 iconv 통합입니다. UTF-8 인코딩 전용으로 EUC-KR용은 요청이 있으면 만들겠습니다.
다운로드
2005.5.22 01:58

1.5.1 버전(mbstring사용 UTF-8 전용)

WordPress 1.5.1 버전이 나왔습니다. 이 패치파일은 1.5.1 버전 용으로 UTF-8로 된 블로그에서 mbstring을 사용하도록 만들었습니다. iconv용과 EUC-KR용은 요청이 있으면 만들겠습니다. 받는 트랙백 부분은 sanulim님이 달아주신 코멘트를 이용하여 만들었으며 보내는 트랙백은 1.5 버전과 동일합니다.
다운로드
2005.5.19 20:00

도움주신분들

이 포스트가 알려지도록 도움 주신 아거님과 테스트에 도움주신 입명이님, H.Moon님, BluedSnow님께 감사드립니다
2005. 4. 6 00:41

통합패치

아래에 있는 4개의 다른 패치적용 파일을 하나로 합한 파일이다. UTF-8과 EUC-KR에 상관없이 작동한다. mbstring이 있으면 mbstring을 사용하고 없을경우 iconv를 사용한다. 만약 둘 다 없는 경우 체크박스가 나오지 않는다. 그러므로 체크박스가 나오지 않는다면 설치를 잘못 하였거나 호스팅 업체에서 지원을 하지 않는 경우이다. 일반적인 경우 통합버젼 사용을 권장한다.

압축을 푼 후 워드프레스가 설치된 폴더에 복사한다. (예 : /blog)
6개의 파일이 덮어쓰기되면 파일 복사가 제대로 된 것임.
통합패치 : 다운

주의사항

적용대상 :
– 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을 따른다. 수정 및 재배포 모두 가능함.

사용방법

받는 트랙백은 자동으로 변환된다.
보내는 트랙백은 트랙백 보내는 주소 오른쪽에 생긴 체크박스를 수동으로 체크함으로서 변환한다. 트랙백 받는 블로그가 내 블로그와 다른 인코딩을 사용할 경우 체크한다. 같은 인코딩인데 체크할 경우 오히려 트랙백이 깨지게 되므로 인코딩이 같을 경우엔 체크하지 않고 트랙백을 보낸다.
상대의 인코딩을 알아내는 방법은 브라우져의 보기 – 인코딩 메뉴를 보면 알 수 있다.

패치적용 파일

이 파일은 아래의 내용을 직접 수정하기 번거로운 사람을 위한 파일로 아래 적힌 수정 방법을 모두 적용하여 압축한 파일이다.
압축을 푼 후 워드프레스가 설치된 폴더에 복사한다. (예 : /blog)
6개의 파일이 덮어쓰기되면 파일 복사가 제대로 된 것임.
Wordpress 1.5 UTF-8 용 수정파일(mbstring 모듈 사용) : 다운
Wordpress 1.5 EUC-KR 용 수정파일(mbstring 모듈 사용) : 다운
Wordpress 1.5 UTF-8 용 수정파일(iconv 모듈 사용) : 다운
Wordpress 1.5 EUC-KR 용 수정파일(iconv 모듈 사용) : 다운

받는 트랙백핑 문제 해결(mbstring)

mb_detect_encoding을 이용하여 들어오는 트랙백핑의 인코딩을 검사한후 blog_charset에 설정된 내 블로그의 인코딩으로 변환해 준다.

/wp-trackback.php를 열어

$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);

를 아래와 같이 바꾼다($charset이 수정되는 것임)

$title = mb_convert_encoding($title, get_settings('blog_charset'), mb_detect_encoding($title, 'UTF-8, EUC-KR') );
$excerpt = mb_convert_encoding($excerpt, get_settings('blog_charset'), mb_detect_encoding($excerpt, 'UTF-8, EUC-KR') );
$blog_name = mb_convert_encoding($blog_name, get_settings('blog_charset'), mb_detect_encoding($blog_name, 'UTF-8, EUC-KR') );

받는 트랙백핑 문제 해결(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

같은 파일(/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);
}

를 아래와 같이 바꾼다(UTF-8의 경우)

if ( !is_utf8($title) ) $title = iconv('EUC-KR', get_settings('blog_charset'), $title);
if ( !is_utf8($excerpt) ) $excerpt = iconv('EUC-KR', get_settings('blog_charset'), $excerpt);
if ( !is_utf8($blog_name) ) $blog_name = iconv('EUC-KR', get_settings('blog_charset'), $blog_name);

EUC-KR의 경우는 아래와 같이 바꾼다 (if문 조건에서 !이 빠지고 ‘EUC-KR’이 ‘UTF-8’로 바뀜)

if ( is_utf8($title) ) $title = iconv('UTF-8', get_settings('blog_charset'), $title);
if ( is_utf8($excerpt) ) $excerpt = iconv('UTF-8', get_settings('blog_charset'), $excerpt);
if ( is_utf8($blog_name) ) $blog_name = iconv('UTF-8', get_settings('blog_charset'), $blog_name);

보내는 트랙백핑 문제 해결

1. 먼저 EUC-KR로 트랙백핑을 보낼지를 선택하는 체크박스를 만든다. 체크박스를 체크하면 char_encoding에 value값인 “EUC-KR”이 전달된다. 일반폼과 advanced폼 모두 바꿔주기 위해 두개의 파일을 수정한다. (EUC-KR 사용자 : 이 단계에서 “EUC-KR”을 “UTF-8″로 바꿔서 수정한다. 나머지 부분은 UTF-8 사용자와 같이 수정한다.)

/wp-admin/edit-form.php를 열어

<input type="text" name="trackback_url" style="width: 360px" id="trackback" tabindex="7" /></p>

를 아래와 같이 바꾼다 (첫째줄의 </p>이 추가되는 줄로 옮겨가는 것 주의)

<input type="text" name="trackback_url" style="width: 360px" id="trackback" tabindex="7" />
<label for="char_enc"><input type="checkbox" name="char_encoding" id="char_enc" value="EUC-KR" /> EUC-KR</label></p>

/wp-admin/edit-form-advanced.php를 열어

<td>< ?php echo $form_trackback; ?> <br />

를 아래와 같이 바꾼다

<td>< ?php echo $form_trackback; ?> <label for="char_enc"><input type="checkbox" name="char_encoding" id="char_enc" value="EUC-KR" /> EUC-KR</label><br />

2. do_trackbakcs 함수에 폼으로부터 넘겨받은 $char_encoding값을 인수로 전달한다.

/wp-admin/post.php를 열어 do_trackbacks를 찾은 후

do_trackbacks($post_ID);

를 아래와 같이 바꾼다(2곳을 수정해야 함)

do_trackbacks($post_ID, $_POST['char_encoding']);

3. do_trackbacks 함수가 선언된 곳을 찾아서 매개변수 $char_enc를 추가하고 이 값을 trackback 함수의 인수로 넘긴다.

/wp-includes/functions-post.php를 열어

function do_trackbacks($post_id) {

를 아래와 같이 바꾼다

function do_trackbacks($post_id, $char_enc) {

또 몇줄 밑의

trackback($tb_ping, $post_title, $excerpt, $post_id);

를 아래와 같이 바꾼다

trackback($tb_ping, $post_title, $excerpt, $post_id, $char_enc);

4. trackback함수가 선언된 곳을 찾아서 매개변수 $encoding을 추가한다. $encoding에 값이 들어가 있으면 mb_convert_encoding을 이용하여 트랙백핑 보낼 제목, 요약, 블로그이름을 $encoding의 값으로(체크박스의 value값, 여기서는 EUC-KR) 인코딩을 변환한다. 체크박스가 선택되지 않아 $encoding에 값이 없으면 인코딩을 변환하지 않고(여기서는 utf-8) 트래픽핑을 보낸다.

/wp-includes/functions.php를 열어

function trackback($trackback_url, $title, $excerpt, $ID) {
global $wpdb;
$title = urlencode($title);
$excerpt = urlencode($excerpt);
$blog_name = urlencode(get_settings('blogname'));

mbstring 모듈을 사용할 경우에는 아래와 같이 바꾸고

function trackback($trackback_url, $title, $excerpt, $ID, $encoding) {
global $wpdb;
$blog_name = get_settings('blogname');
if($encoding) {
$title = mb_convert_encoding($title, $encoding, get_settings('blog_charset'));
$excerpt = mb_convert_encoding($excerpt, $encoding, get_settings('blog_charset'));
$blog_name = mb_convert_encoding($blog_name, $encoding, get_settings('blog_charset'));
}
$title = urlencode($title);
$excerpt = urlencode($excerpt);
$blog_name = urlencode($blog_name);

iconv 모듈을 사용할 경우에는 아래와 같이 바꾼다

function trackback($trackback_url, $title, $excerpt, $ID, $encoding) {
global $wpdb;
$blog_name = get_settings('blogname');
if($encoding) {
$title = iconv(get_settings('blog_charset'), $encoding, $title);
$excerpt = iconv(get_settings('blog_charset'), $encoding, $excerpt);
$blog_name = iconv(get_settings('blog_charset'), $encoding, $blog_name);
}
$title = urlencode($title);
$excerpt = urlencode($excerpt);
$blog_name = urlencode($blog_name);

90 thoughts on “워드프레스 트랙백핑 인코딩 문제 해결

  1. pdaclub

    아,, 그렇군요, 관심가져주셔서 감사합니다..

    죄송하지만 제 홈페이지 경로나온 덧글은 삭제좀 부탁드려요..
    첫번쨰 덧글에 적었는데, 잘못나와서리..

  2. jeolee

    예전에 1.5버전용을 잘 받아 사용했었는데 저는 iconv용을 썼었습니다.
    1.5.1버전으로 iconv용을 좀 부탁드립니다. 그 사이에 보니 1.5.1.1버전도 나왔던데 1.5.1과도 차이가 없는건지 모르겠군요.

    받아만 쓰고 있어 죄송하네요. :)

  3. thinkini Post author

    pdaclub님께
    네^^

    jeolee님께
    1.5.1.1을 받아서 iconv 통합으로 올렸습니다^^
    jeolee님 블로그 가보고 반했습니다
    제가 타이포그라피에 열광하는데 텍스트기반으로 그렇게 멋진 블로그를 만드셔서..
    폰트가 많은 영어가 아닌 한글로 하셔서 더 대단합니다.
    게다가 Firefox 플러그인인 Web Developer를 이용해서 CSS를 Disable시켜봤는데
    정확하게 내용들이 열거되네요..
    이렇게 멋진 블로그가 제 hack을 이용하니 오히려 제가 보람을 느낍니다^^

  4. jeolee

    1.5.1.1용 통합버전, 잘 받았습니다. 감사합니다. thinkini님 덕분에 wordpress를 잘 쓰고 있죠. 이 문제가 이전작업에 가장 큰 문제였거든요.

  5. Pingback: freshworks design Studio

  6. SHIBATA

    정보 감사합니다.
    1.5.1.3 버전(UTF-8)을 인스톨 했답니다. 헌데 소스를 다운 받은 뒤 바로 서버에 올리면 페치가 되는건지요? 아니면 잘 설명하여 적어주신데로 소스를 변경해서 올려야 하는지요?
    답변 부탁드립니다.

  7. thinkini Post author

    SHIBATA님께
    제가 올린 파일은 고쳐진 파일입니다. 밑에 설명 과정대로 고친 걸 올린 거지요.
    그냥 덮어 씌우시면 됩니다^^

    jeolee님 steampunk님 bookworm님께
    여러분의 성원에 보답하고자^^ 좀만 더놀고 플러그인으로 만드는걸 도전해 볼께요.

  8. 입명이

    여기에 글 남겨요.~
    잘 지내시죠?
    저도 워드프레스 한동안 방치시켜놓고~
    다시 시작하면서 태터툴즈로 변경했답니다. ㅎ
    태터의 다음 버젼도 기대해보구요.
    태터툴즈도 UTF-8이 적용이 되기를 기대하고 있습니다. :)
    다시 블로그 시작하시는데~ 화이팅입니다. :)

  9. Pingback: UNFGroup

  10. space

    혹시 태터툴 컨버터 같은건 없나요..
    옮기려고 생각중인데.. 원래 데이타를 옮길 방법이 없네요..

    이거 코멘트 반드시 메일 작성해줘야 하네여..흠

  11. thinkini Post author

    space님께
    곰님이 만드신걸 한날님이 수정했다고 하는 컨버터가 있습니다
    http://www.hannal.com/blog/index.php?pl=692
    웰컴투프리미어리그.. 아니 워드프레스..

    아 그리고 워드프레스 사용하시면 코멘트에 메일은 기본입니다^^

    입명이님께
    잠수한척있으면서 예전글옮기기 하고있었는데 1.5.2버전등장으로 다시 수면위로 빼꼼 고개를 내밀었습니다.. 7월 1일에서 8월 1일로 다시 9월 1일로 정식 블로그 개장이 미뤄지네요.. 머 에버랜드 야간개장이나 김수미게장같은 특별함은 없겠지만 그래도^^

  12. H.Moon

    항상 빠른 패치에 감사드리고 있습니다.
    그런데, 이건 제가 코딩에 대한 지식이 많이 없어서 어느쪽에 문의할지 몰라서 드리는 질문입니다만…

    533번째 라인에 보면, 인코딩에 대한 변수가 하나 더 추가 되잖아요? Ecto라는 WP용 엔트리 포스팅 툴이 있는데, 이 툴이 포스팅을 할 때면, 이 부분에서 에러를 표시합니다.

    이걸 어떻게 하면 좋을까요?

  13. thinkini Post author

    H.Moon님께
    요즘 쓸데없이 바빠서 답변이 늦었습니다..
    제가 ecto툴이 없어서 확인을 할수가 없네요
    전에 한번 깔았다 지워서 2주사용기간이 지나버려서..
    그래서 어떤식으로 동작하는지는 잘 모르겠습니다

    흠 지금 생각해보니 제가 default parameter에 대한 착각을 한것 같습니다
    저도 php에 대해선 아는게 거진 없지만 C++과 비슷하다고 하니까 C++을 기준으로 생각하자면 default parameter가 동작하려면 prototype에 기술해줘야 하는데 그냥 사용하면 부족한 인수에 null값이 들어간다고 착각했습니다
    일단 default parameter를 이용하는 방법으로 수정해 보겠습니다
    안되면 제가 php책을 좀 찾아봐서 function overloading으로 할수 있게 해보겠습니다

    책벌레님께
    다 다른분들이 트랙백도 보내주고 하신 덕이지요^^

  14. H.Moon

    새로이 만들어주신 두 파일을 방금 설치해 봤습니다.
    엑토에서도 아무런 문제없이 잘 작동되며, 어떠한 에러메시지도 보내질 않네요.
    성공인것 같습니다.
    감사합니다~

  15. unfusion

    인사도 없이 만들어 주신 패치를 잘 쓰고 있는 염치없는 사람입니다. 안 그래도 엑토에서의 에러 때문에 이전 버전의 xmlrpc.php를 복사해서 쓰고 있었는데 수정 버전이 올라와서 기쁜마음에 받아서 설치를 했습니다. 그런데 같은 UTF-8 인코딩 사이에 트랙백을 보낼때 타이틀이나 블로그 이름은 이상없이 나오는데 excerpt 부분이 깨져서 나오네요. 제 블로그에서만 그런건지, 죄송하지만 확인 좀 부탁드려도 될까요.
    http://www.ceprix.net/archives/pathstats-installed/
    이 쪽에 트랙백을 보냈는데 깨져서 제 블로그에서 테스트를 해봤더니 똑같더군요.

  16. thinkini Post author

    H.Moon님께
    테스트 해주시고 문제점 보고해주셔서 감사합니다^^

    unfusion님께
    unfusion님의 문제는 워드프레스 자체의 문제였습니다
    특이한 경우로 excerpt를 자르는 과정에서 발생하는 문제인듯 합니다
    버그 보고를 하고 싶은데 짧은 영어라..^^

  17. unfusion

    아, 워드프레스의 문제 였군요. 이런 특이한 케이스에 걸리다니 ^^;, 문제가 발생한 포스트를 수정하고 잘 되는지 봐야 겠네요. 테스트 해주셔서 감사합니다.

  18. thinkini Post author

    unfusion님께
    지금 블로그에 다시 가봤는데 아직도 테스트중이시군요
    다른 트랙백도 깨져있어서 그것도 복사해서 패치를 안한 워드프레스에서 트랙백을 해본 결과 역시나 깨지더군요
    생각보다 상당히 자주 발생하게 되는 문제인것 같습니다
    버그 보고를 해야할 수준인듯..

  19. unfusion

    네 지금 엑토를 사용해 포스팅한 글에서 공통적으로 발생하는건 아닌가 하고 확인하고 있었습니다. WB Editor2 라는 블로깅 클라이언트를 잠시 쓴 적 있는데 그 툴에서 작성한 글에서는 문제가 발생하지 않는 것 같기도 해서요. 개행 코드를 강제로 삽입하면 어떻게 될까 궁금 하기도 하구요.

  20. thinkini Post author

    저는 ecto가 아닌 워드프레스 자체에서 테스트 한거라 ecto만의 문제는 아닌것 같습니다
    소스를 보니 except를 짜르는 핵심은 /wp-includes/functions.php의 apply_filters라는 함수 같은데 봐도 잘 모르겠네요
    아무튼 방법을 알게 되면 워드프레스에 버그 보고도 하셔서 다음 버전에는 이런 문제가 없게 해주세요^^

  21. unfusion

    저는 wp-trackback.php의 101번째 라인이 excerpt를 255 (252 + “…” )길이로 잘라내는 것 같아서 건드려 보고 있는데 php에 대해 무지해서 쉽질 않네요.

    그리고 저도 영어가 약해서 버그 보고를 할 수 있으려나 모르겠습니다.

  22. thinkini Post author

    unfusion님께
    제가 이 hack을 만드느라 알아낸 걸로는 wp-trackback.php는 받는 트랙백을 담당합니다. 그 부분은 255자 이상의 길이로 들어오는 excerpt를 자르는 부분인거 같습니다.
    흠흠 시간이 나면 저도 방법을 찾아보겠습니다^^

  23. thinkini Post author

    unfusion님께
    지금 테스트해 본 결과 unfusion님의 생각이 옳았습니다. 일단 받는 트랙백에서의 문제입니다. 워드프레스 자체에서 받는 트랙백을 mb_convert_encoding 함수를 통해 인코딩 변경을 하는데 그때 utf-8로 재변환시키면서 트랙백이 깨지게 됩니다. 이 부분을 주석처리 하니까 깨지지 않습니다. 그렇다고 이걸 없애서 해결할게 아니라 보다 근본적인 문제는 트랙백을 보낼때 $excerpt = substr($excerpt, 0, 252) . ‘…';을 통해서 멀티바이트문자에 관계없이 그냥 짤라서 보낸다는 것입니다. 그래서 받는쪽에서 오류가 발생하게 됩니다. 위에 언급한 apply_filter()는 먼가 복잡해서 이걸로 멀티바이트 문자를 쪼개는 걸로 착각했는데 말그대로 필터를 적용하는 함수더군요. 이 함수는 상관없습니다 제가 잘못 생각한 것입니다. 이 문제에 대해선 여러가지 해결방법이 있는데 /wp-includes/function-post.php의 do_trackbacks함수에서 문제를 해결하는 방법이 가장 좋을것 같습니다.

  24. unfusion

    유니코드용 함수를 인터넷에서 찾아내 삽입한 뒤에 $excerpt를 검사해서 UTF-8 일때는 substr() 대신에 유니코드용 함수로 잘라내면 해결 되지 않을까 했는데 뭐가 잘못 됐는지 잘 안되더군요. 오늘 아침에 pathstat 플러그인 만들던거 날려먹느라고 잊고 있었는데 다시 들여다 봐야 겠습니다.
    (받는 쪽의 문제라면…받는 쪽이 문제가 해결된 인코딩 패치를 설치한 상태라야 제대로 $experpt를 잘라낼 수 있겠군요)

  25. thinkini Post author

    unfusion님께
    받는 쪽에서 인코딩을 변환 시키는 것이라 문제이긴 한데 근본적인 문제는 문자를 제대로 자르지 않고 보내서 인코딩을 헤깔리게 만든다는 것이지요^^
    여러가지 해결방법 중에서 고민하다 그냥 가장 간편한 방법을 택했습니다.

  26. Pingback: 절망 클럽

  27. Pingback: Flow

  28. Jay

    안녕하세요. 패치 잘 받아서 쓰고 있습니다. 그런데 functions.php 에서 $trackback_url 은 인코딩 변경을 안하셨는데요, 이유가 궁금합니다. 한글이 들어있는 URL 에서 트랙백이 온 경우 안나올 때가 있어서요…이거 바꾸면 어떻게 되나요?

  29. 바람 Post author

    Jay님께
    안나온다 함은 트랙백 자체가 안나오는 것입니까 아니면 url만 안나온다는 것인지요
    한글 url은 여러가지로 난감하군요
    블로그의 인코딩과 상관없이 서버의 인코딩을 따르니까 utf-8로 인코딩된 블로그라도 폴더 이름은 euc-kr인 경우도 많을 테구요
    링크 클릭했을때의 문제라면 브라우져의 옵션도 상관이 있을거고..
    아무튼 좀더 자세히 문제점을 설명해 주시면 방법을 생각해 보겠습니다^^
    일단은 손 안대시는게 좋을거 같군요

  30. Jay

    네에. 트랙백을 받았는데, 다른 건 나오는 데 보낸 URL에 한글이 들어있어서, 한글 URL만 안나옵니다. 깨져서 나오는 게 아니고 URL 가운데 한글 부분이 빠져서 나오네요.

  31. 바람 Post author

    Jay님께
    답변이 많이 늦었죠.. 이제야 여유가 좀 나네요^^
    한글폴더에 블로그를 설치하고 시험해 봤는데 단순한 문제가 아니더군요
    일단 기본적으로 워드프레스는 코멘트의 링크주소에 한글을 쓰지 못합니다
    windlike.net/한글주소1/ 을 입력하면 windlike.net/1/ 이 입력됩니다
    그래서 이 문제를 해결하기 위해선 코멘트 쪽도 수정해야 합니다
    트랙백 주소를 올바르게 변환하는데까진 성공했는데 결국 코멘트로 입력되는 과정에서 한글은 사라져 버리는 군요
    %도 사라져서 나오기 때문에 코멘트쪽 파일들을 손보지 않는한 방법이 없습니다

  32. Pingback: Wordpress 관련 글 및 링크 모아두기 « kukie store

  33. Pingback: Blooming Town | 업데이트와 몇가지 알림

  34. Pingback: Blooming Town | 트랙백핑 인코딩 문제

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>