2015-07-19 9 views
12

Ho un testo-blocco Unicode, in questo modo:Come convertire un blocco di testo Unicode in un punto di codice UTF-8 (HEX)?

ụ 
ư 
ứ 
Ỳ 
Ỷ 
Ỵ 
Đ 

Ora, voglio convertire questo originale Unicode text-blocco in un testo-blocco di point-8 UTF (HEX) codice (vedere la Colonna esadecimale UTF-8, in questa pagina: https://en.wikipedia.org/wiki/UTF-8), da PHP; in questo modo:

\xe1\xbb\xa5 
\xc6\xb0 
\xe1\xbb\xa9 
\xe1\xbb\xb2 
\xe1\xbb\xb6 
\xe1\xbb\xb4 
\xc4\x90 

Non come questo:

0x1EE5 
0x01B0 
0x1EE9 
0x1EF2 
0x1EF6 
0x1EF4 
0x0110 

Esiste un modo per farlo, da PHP?


Ho letto questo argomento (PHP: Convert unicode codepoint to UTF-8). Ma, non è simile alla alla mia domanda.


Mi dispiace, non ne so molto di Unicode.

+1

dovete sapere (o provare ad indovinare, ma che funziona solo qualche volta) ciò che codifica il vostro input è in. Se è già in UTF-8, probabilmente è già nel formato che vuoi - assumendo che per '0xe1' non intendi i 4 byte che rappresentano' 0', 'x',' e', '1 'ma piuttosto un byte che rappresenta il numero 225. – Jon

+2

La [seconda risposta sulla domanda che si collega a] (http://stackoverflow.com/a/7153133/266143) _does_ converte un punto di codice Unicode in byte UTF-8. – CodeCaster

+0

Puoi mostrare cosa hai provato? In modo che possiamo sapere esattamente cosa stai cercando di fare. Attualmente, ci sono molti modi per interpretare la tua domanda, poiché stiamo cercando di indovinare il tuo scopo nel fare questa conversione. – nhahtdh

risposta

1

La cosa principale che devi fare è dire a PHP di interpretare correttamente i caratteri Unicode in arrivo. Una volta che lo fai, puoi convertirli in UTF-8 e poi in esadecimale se necessario.

Questo codice di errore prende il tuo carattere di esempio in Unicode, li converte in UTF-8 e quindi scarica la rappresentazione esadecimale di quei caratteri.

<?php 
// Hex equivalent of "ụưứỲỶỴĐ" in Unicode 
$unistr = "\x1E\xE5\x01\xB0\x1E\xE9\x1E\xF2\x1E\xF6\x1E\xF4\x01\x10"; 
echo " length=" . mb_strlen($unistr, 'UCS-2BE') . "\n"; 

// Here's the key statement, convert from Unicode 16-bit to UTF-8 
$utf8str = mb_convert_encoding($unistr, "UTF-8", 'UCS-2BE'); 
echo $utf8str . "\n"; 

for($i=0; $i < mb_strlen($utf8str, 'UTF-8'); $i++) { 
    $c = mb_substr($utf8str, $i, 1, 'UTF-8'); 
    $hex = bin2hex($c); 
    echo $c . "\t" . $hex . "\t" . preg_replace("/([0-9a-f]{2})/", '\\\\x\\1', $hex) . "\n"; 
} 

?> 

Produce

length=7 
ụưứỲỶỴĐ 
ụ e1bba5 \xe1\xbb\xa5 
ư c6b0 \xc6\xb0 
ứ e1bba9 \xe1\xbb\xa9 
Ỳ e1bbb2 \xe1\xbb\xb2 
Ỷ e1bbb6 \xe1\xbb\xb6 
Ỵ e1bbb4 \xe1\xbb\xb4 
Đ c490 \xc4\x90 
13

Penso che tu stai cercando il bin2hex() function:

Converte i dati binari in rappresentazione esadecimale

e il formato anteponendo ad ogni \x byte (00-FF)

function str_hex_format ($bin) { 
    return '\x'.implode('\x', str_split(bin2hex($bin), 2)); 
} 

per il campione:

// utf8 encoded input 
$arr = ["ụ","ư","ứ","Ỳ","Ỷ","Ỵ","Đ"]; 

foreach($arr AS $v) 
    echo $v . " => " . str_hex_format($v) . "\n"; 

See test at eval.in (link scade)

ụ => \xe1\xbb\xa5 
ư => \xc6\xb0 
ứ => \xe1\xbb\xa9 
Ỳ => \xe1\xbb\xb2 
Ỷ => \xe1\xbb\xb6 
Ỵ => \xe1\xbb\xb4 
Đ => \xc4\x90 

esempio Decode: $str = str_hex_format("ụưứỲỶỴĐ"); echo $str;

01.235.164,106 mila

\ XE1 \ xbb \ xa5 \ XC6 \ xb0 \ XE1 \ xbb \ xA9 \ XE1 \ xbb \ xb2 \ XE1 \ xbb \ xB6 \ XE1 \ xbb \ xB4 \ XC4 \ x90

echo hex2bin(str_replace('\x', "", $str)); 

ụưứỲỶỴĐ


Per maggiori informazioni sulla sequenza di escape \x in corde doppie citato see php manual.

+0

+1. Questo è esattamente come lo faccio per codepoints.net: https://github.com/Codepoints/Codepoints.net/blob/19184d5cf40f9d335487db9ad58318af2ba0149c/codepoints.net/lib/codepoint.class.php#L99-L104 – Boldewyn

3

PHP considera le stringhe come matrici di caratteri, indipendentemente dalla codifica. Se non è necessario per delimitare i caratteri UTF8, quindi qualcosa come questo funziona:

$str='ụưứỲỶỴĐ'; 
foreach(str_split($str) as $char) 
    echo '\x'.str_pad(dechex(ord($char)),'0',2,STR_PAD_LEFT); 

uscita:

\xe1\xbb\xa5\xc6\xb0\xe1\xbb\xa9\xe1\xbb\xb2\xe1\xbb\xb6\xe1\xbb\xb4\xc4\x90 

Se è necessario delimitare i caratteri UTF8 (cioè con un ritorno a capo), quindi avrete bisogno di qualcosa di simile:

$str='ụưứỲỶỴĐ'; 
foreach(array_slice(preg_split('~~u',$str),1,-1) as $UTF8char){ // split before/after every UTF8 character and remove first/last empty string 
    foreach(str_split($UTF8char) as $char) 
    echo '\x'.str_pad(dechex(ord($char)),'0',2,STR_PAD_LEFT); 
    echo "\n"; // delimiter 
} 

uscita:

\xe1\xbb\xa5 
\xc6\xb0 
\xe1\xbb\xa9 
\xe1\xbb\xb2 
\xe1\xbb\xb6 
\xe1\xbb\xb4 
\xc4\x90 

Questo divide la stringa in caratteri UTF8 utilizzando preg_split e il flag u. Poiché preg_split restituisce la stringa vuota prima del primo carattere e la stringa vuota dopo l'ultimo carattere, è necessario array_slice il primo e l'ultimo carattere. Questo può essere facilmente modificato per restituire un array, ad esempio.

Edit: Un modo più "corretto" per farlo è questo:

echo trim(json_encode(utf8_encode('ụưứỲỶỴĐ')),'"'); 
Problemi correlati