'\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;
}
$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;
}
'PHP' 카테고리의 다른 글
[PHP] xml 데이터를 배열로 변환 (xml to json to array) (0) | 2011.07.11 |
---|---|
[PHP] in_array 사용시 integer 0 주의 (0) | 2011.04.26 |
[PHP] WebSocket 서버를 구성해서 handshake 데이터를 계산할 때 주의사항. [unsigned integer] (0) | 2010.12.02 |
[PHP] 대용량 파일업로드를 위한 설정 (ini settings for upload large size file) (0) | 2010.11.22 |
[PHPUnit] echo를 하는 함수의 테스트 (0) | 2010.11.01 |