'\uXXXX\uXXXX\uXXXX'
뭐 이딴식으로 이미 포매팅 된 유니코드가 날아오면 그것을 적절히 변환시키는 것.
java script로 치면 unescape()

뭘 해야 하는지를 나열한 것이지 아름다움을 추구한 소스는 절대 아님..


// 일단 이런 문자열이 왔다 치자.
$in = "\uACE0\uD488\uACA9 \uC720\uB7FD \uC885\uD569\uC1FC\uD551"; // 고품격 유럽 종합쇼핑

// 스페이스바 처리 (탭 같은건 처리 안했음..)
$s = preg_replace("/[\s]/s", "\u0020", $in);
// \u -> %로 변환. \u 가 아닌 것들은 %00X로 변환
$s = preg_replace("/((\\\u([0-9A-F]+))|(.*?))/ie", "conv(\"$1\")", $s);
// url decode
$s = rawurldecode($s);
// 적절히 인코딩 변환 후 출력 해보기
echo iconv('utf-16be', 'utf-8', $s);

// 사용된 함수들


// 정규식으로 뜯어낸 문자열을 적절히 변환
function conv($hex)
{       
    // 빈 값이면 빈값 반환
    if (strlen($hex)<1) return '';
    // 유니코드 문자열이 아니라면 url decode 되도록 구성하여 반환
    if (isUnicode($hex)==false) return '%00'.$hex;

    $hex = getFormatted($hex);

    $sResult = '';
    for ($i=0; $i<strlen($hex); $i++) {
        if ($i%2==0) $sResult .= '%';
        $sResult .= $hex[$i];
    }

    return $sResult;
}

// 유니코드 문자열인지 체크
function isUnicode($hex)
{
    return strpos($hex, '\u')===0;
}

// urldecode 할 수 있도록 포매팅
function getFormatted($hex)
{
    $hex = str_replace('\u', '', $hex);

    $max = 4;
    $len = strlen($hex);
    if ($len<$max) {
        for ($i=$len; $i<$max; $i++) $hex = '0'.$hex;
    }

    return $hex;
}








Posted by bloodguy
,