2010-01-05 2 views
3

이전에 UTF-8에서 UCS-2/HexEncoded 문자열을 얻으려는 질문을 받았고 다음 링크에서 일부 사람들로부터 도움을 받았습니다.UCS2/HexEncoded 문자를 PHP에서 UTF8로

UCS2/HexEncoded characters

는하지만 지금은 PHP에서 UCS-2/HexEncoded 문자열에서 올바른 UTF-8을 얻을 필요가있다. 다음 문자열에 대한

: (! مرحبا عالم)

00480065006C006C006F가 '안녕하세요'는

06450631062d0628064b06270020063906270644064500200021 반환됩니다 아랍어

+0

이전 질문에 대한 답변이 명확하지 않았습니까? –

+0

ucs2 16 진수로 인코딩 된 문자열에서 utf8을 가져올 필요가 있습니다. utcs8로 인코딩 된 ucs2 16 진수로 다시 변환해야합니다. – mabukarim

답변

3

에 당신은 진수-표현을 구도 할 수와 16 진수 문자를 변환하여 반환 hexdec(), 구성 요소 문자를 다시 포장 한 다음 mb_convert_encoding()을 사용하여 UCS-2를 UTF-8로 변환하십시오. 다른 질문에 대한 답변에서 언급했듯이 출력 인코딩에주의를 기울여야합니다. 여기서는 UTF-8을 구체적으로 요청 했으므로 향후 샘플에 사용하겠습니다.

다음은 16 진수로 된 UCS-2를 기본 문자열 형식의 UTF-8로 변환하는 작업을 수행하는 샘플입니다. PHP는 현재 hex2bin() 함수를 제공하지 않으므로 매우 쉽게 만들 수 있습니다. 마지막에 참조 링크에 게시 된 것을 사용합니다. 나는 local_hex2bin()으로 이름을 바꿨습니다. PHP의 향후 버전과 충돌하거나 프로젝트에 포함 된 다른 제 3 자 코드의 정의와 충돌 할 수도 있습니다.

<?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() 함수 원본에 대한 링크이다. mb_convert_encoding() 호출하기 전에 내 의견에 언급 한 바와 같이
PHP: bin2hex(), comment #86123 @ php.net

또한, 당신은 아마 시도하고 응용 프로그램이 부품 곳이있다 특히, 순서는 소스에서 사용하고 있습니다 엔디안하는 감지 할 수 있습니다 한 서버에있는 하나 이상의 CPU가 나머지 방향과 방향이 다릅니다.

다음은 BOM (바이트 순서 표시)을 식별하는 데 도움이되는 링크입니다.
Byte order mark @ Wikipedia

+0

감사합니다. 내게 잘 작동합니다. – mabukarim

+2

동일한 작업을 수행하는 데 더 간단한 방법이 있습니다. '$ 쿼리 스트링 ='06450631062d0628064b06270020063906270644064500200021 ';' '$의 STR = 팩 ('H의 * '$의 쿼리 스트링)' '$ ucs2string = mb_convert_encoding ($ STR 'UTF-8', 'UCS-2'); ' – Jay

관련 문제