Php UTF8 UCS2/HexEncoded karakter

1 Cevap php

Ben UTF-8 bir UCS-2/HexEncoded dize almak için daha önce bir soru sordu ve ben aşağıdaki linkten bazı adamlar bazı yardım aldım.

UCS2/HexEncoded characters

Ama şimdi ben PHP bir UCS-2/HexEncoded dizeden doğru UTF-8 almak gerekir.

Şu dizeleri:

00480065006C006C006F 'Hello' dönecektir

06450631062d0628064b06270020063906270644064500200021 dönecektir (! مرحبا عالم) arapça

1 Cevap

Sen, hexdec() ile onaltılık karakter dönüştürme bileşeni karakter yeniden ambalajlama, ve sonra UTF-8 içine UCS-2 dönüştürmek için mb_convert_encoding() kullanarak Hex temsilini tekrar oluşturabilirsiniz. Ben senin benim diğer sorunuza cevap belirtildiği gibi özellikle UTF-8 talep ettik, bu yüzden yaklaşan örnek için bunu kullanırız burada rağmen, hala, çıkış kodlama ile dikkatli olmak gerekir.

Burada yerel dize şeklinde UTF-8 Hex UCS-2 dönüştürme çalışır bir örnek. PHP'nin şeyler çok kolay kılacak bir hex2bin() fonksiyonu ile gelmez, biz sonunda referans linkten yayınlanmıştır birini kullanacağız. Ben bunu değiştirildi ettik * local_hex2bin () * ihtimale karşı bu PHP'nin sonraki sürümü ya da projeye dahil diğer bazı 3. parti kod bir tanımı ile çelişmektedir.

<?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>';
?>

Yerel olarak, bu örnek sayfa UCS2HexToUTF8.php denilen ve daha sonra çıkışını ayarlamak için bir sorgu dizesi kullanılır.

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

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

Here's the link to the original source of the hex2bin() function.
PHP: bin2hex(), comment #86123 @ php.net

Çağrısı önce benim yorumlarda da belirtildiği gibi, mb_convert_encoding(), muhtemelen uygulama nerede bir veya daha fazla CPU üzerinde parçalar vardır, özellikle deneyin ve kaynak tarafından kullanımda hangi endian sipariş algılamak isteyeceksiniz bir sunucu yönlendirme ile diğerlerinden farklıdır.

Here's a link that can help you identify the byte-order marks (BOM).
Byte order mark @ Wikipedia