Domanda

ho fatto una domanda in precedenza per ottenere una stringa UCS-2 / HexEncoded da UTF-8, e ho avuto un po 'di aiuto da parte di alcuni ragazzi al seguente link.

UCS2 / HexEncoded caratteri

Ma ora ho bisogno di ottenere la corretta UTF-8 da una stringa UCS-2 / HexEncoded in PHP.

Per i seguenti stringhe:

00480065006C006C006F tornerà 'Ciao'

06450631062d0628064b06270020063906270644064500200021 torneranno (! مرحبا عالم) in arabo

È stato utile?

Soluzione

È possibile ricomporre un Hex-rappresentazione convertendo i caratteri esadecimali con hexdec () , repacking i caratteri dei componenti, e quindi utilizzando mb_convert_encoding () per convertire da UCS- 2 in UTF-8. Come ho detto nella mia risposta alla tua domanda di altri, sarà ancora bisogno di stare attenti con la codifica di uscita, anche se qui hai specificamente richiesto UTF-8, quindi useremo che per il campione imminente.

Ecco un esempio che fa il lavoro di conversione di UCS-2 in Hex in UTF-8 in forma di stringa nativa. Come PHP attualmente non viene fornito con una funzione di HEX2BIN () , che renderebbe le cose molto facili, useremo quello pubblicato al link di riferimento alla fine. Ho rinominato a local_hex2bin () solo nel caso in conflitto con una futura versione di PHP o con una definizione in qualche altro codice 3rd party di includere nel progetto.

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

A livello locale, ho chiamato questa pagina di esempio UCS2HexToUTF8.php, e poi usato un querystring per impostare l'uscita.

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

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

Ecco il link alla fonte originale della la funzione HEX2BIN ().
PHP: BIN2HEX (), commento # @ 86.123 php.net

Inoltre, come notato nei miei commenti prima della chiamata a mb_convert_encoding () , probabilmente si vorrà provare a rilevare quale Endian ordinamento è in uso dalla sorgente, soprattutto se l'applicazione dispone di parti dove una o più CPU su un server differiscono dal resto da orientamento.

Ecco un link che può aiutare a identificare i segni di ordine di byte (BOM).
@ Wikipedia

Altri suggerimenti

Una conversione più accurata di UCS-2 a UTF-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;
}

Il problema sulla risposta selezionata è che è stata divisa per 2 invece di 4, che causerebbe la conversione di 00 nulla e farà sì che questo venga visualizzato quando viene utilizzato su attributi HTML valori come title = "" o alt = ""

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top