문제

나는 이전에 UCS-2/Hexencoded String을 UTF-8에서 얻기 위해 질문을했으며 다음 링크에서 일부 사람들로부터 도움을 받았습니다.

ucs2/hexencoded 문자

그러나 이제 PHP에서 UCS-2/HexenCoded String에서 올바른 UTF-8을 가져와야합니다.

다음 문자열의 경우 :

00480065006c006c006f는 'Hello'가 반환됩니다.

06450631062D0628064B06270020063906270644064500200021은 아랍어로 돌아갑니다 (! مرح 쩌장 عالم)

도움이 되었습니까?

해결책

16 진 숯을 hexdec (), 구성 요소 숯을 다시 포장 한 다음 사용합니다 mb_convert_encoding () UCS-2에서 UTF-8로 변환합니다. 다른 질문에 대한 내 대답에서 언급했듯이, 출력 인코딩에주의를 기울여야하지만 여기서는 UTF-8을 구체적으로 요청했지만 다가오는 샘플에 사용하겠습니다.

다음은 16 진로 UCS-2를 기본 문자열 형식으로 UTF-8로 변환하는 작업을 수행하는 샘플입니다. PHP는 현재 a와 함께 배송되지 않습니다 hex2bin () 기능을 매우 쉽게 만들 수있는 기능은 끝에있는 참조 링크에 게시 된 것을 사용합니다. 이름을 변경했습니다 local_hex2bin () 미래 버전의 PHP와 충돌하거나 프로젝트에 포함 된 다른 타사 코드의 정의와 충돌하는 경우.

<?php
function local_hex2bin($h)
{
if (!is_string($h)) return null;
$r='';
for ($a=0; $a<strlen($h); $a+=2) { $r.=chr(hexdec($h{$a}.$h{($a+1)})); }
return $r;
};

header('Content-Type: text/html; charset=UTF-8');
mb_http_output('UTF-8');
echo '<html><head>';
echo '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />';
echo '</head><body>';
echo 'output encoding: '.mb_http_output().'<br />';
$querystring = $_SERVER['QUERY_STRING'];
// NOTE: we could substitute one of the following:
// $querystring = '06450631062d0628064b06270020063906270644064500200021';
// $querystring = '00480065006C006C006F';
$ucs2string = local_hex2bin($querystring);
// NOTE: The source encoding could also be UTF-16 here.
// TODO: Should check byte-order-mark, if available, in case
//       16-bit-aligned bytes are reversed.
$utf8string = mb_convert_encoding($ucs2string, 'UTF-8', 'UCS-2');
echo 'query string: '.$querystring.'<br />';
echo 'converted string: '.$utf8string.'<br />';
echo '</body>';
?>

로컬로, 나는이 샘플 페이지를 ucs2hextoutf8.php로 호출 한 다음 쿼리 스트링을 사용하여 출력을 설정했습니다.

UCS2HexToUTF8.php?06450631062d0628064b06270020063906270644064500200021
--
encoding: UTF-8
query string: 06450631062d0628064b06270020063906270644064500200021
converted string: مرحبًا عالم !

UCS2HexToUTF8.php?00480065006C006C006F
--
output encoding: UTF-8
query string: 00480065006C006C006F
converted string: Hello

다음은 원래의 원천에 대한 링크입니다. hex2bin () 기능.
php : bin2hex (), 댓글 #86123 @ php.net

또한, 전화 전에 내 의견에 언급 된 바와 같이 mb_convert_encoding (), 특히 응용 프로그램에 한 서버의 하나 이상의 CPU가 방향으로 나머지 CPU와 다른 부분이있는 경우 소스가 사용중인 Endian 주문을 시도하고 감지하려고합니다.

바이트 주문 마크 (BOM)를 식별하는 데 도움이되는 링크가 있습니다.
바이트 주문 마크 @ wikipedia

다른 팁

UCS-2를 UCS-8으로보다 정확한 변환

function ucs2_to_utf8($h)
{
    if (!is_string($h)) return null;
    $r='';
    for ($a=0; $a<strlen($h); $a+=4) { $r.=chr(hexdec($h{$a}.$h{($a+1)}.$h{($a+2)}.$h{($a+3)})); }
    return $r;
}

선택된 답변의 문제는 4 대신 2로 나뉘어져 00을 널로 변환 할 수 있으며 html 속성 값에 사용될 때 Title = ""또는 Alt = ""에 사용될 때이 표시가 나타납니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top