2011-09-30 9 views
13

È possibile una traduzione del seguente codice utilizzando PHP?Come convertire i caratteri UTF8 in entità di carattere numerico in PHP

Il codice qui sotto è stato scritto in JavaScript. Restituisce html con riferimenti di caratteri numerici dove necessario. Ex. smslån -> smslån

Non sono riuscito a creare una traduzione. This script sembrava che può funzionare, ma restituisce å per å invece di å come il javascript di seguito fa.

function toEntity() { 
    var aa = document.form.utf.value; 
    var bb = ''; 
    for(i=0; i<aa.length; i++) 
    { 
    if(aa.charCodeAt(i)>127) 
    { 
     bb += '&#' + aa.charCodeAt(i) + ';'; 
    } 
    else 
    { 
     bb += aa.charAt(i); 
    } 
    } 
    document.form.entity.value = bb; 
} 

PHP's ord function suona come si fa la stessa cosa come charCodeAt, ma non è così. Ottengo per å utilizzando ord e utilizzando charCodeAt. Quello, o sto avendo alcuni problemi di codifica incredibilmente difficili.

+0

Vuoi dire [questo?] (Http://www.php.net/manual/en/function.mb-encode-numericentity.php#88586), o la risposta di phihag di seguito, in pratica? Non vedo una versione utf8 di ord ovunque. – darkAsPitch

+0

Non ne sono sicuro. Ho provato a giocare con il codice di Miguel per 20 minuti, ma sembra quello che phihag di seguito suggerito è esattamente quello di cui avevo bisogno. In termini di questa applicazione comunque. C'è qualche ragione per credere che non lo sia? – darkAsPitch

risposta

32

Uso mb_encode_numericentity:

$convmap = array(0x80, 0xffff, 0, 0xffff); 
echo mb_encode_numericentity($utf8Str, $convmap, 'UTF-8'); 
+1

Sì, mentre volevo rispondere, ho visto che l'hai già fatto, così ho notato. ;) È davvero una funzione interessante per il lavoro. – hakre

+3

L'unica cosa che mi preoccupa è che $ convmap: cos'è esattamente? Non c'è una grande spiegazione nella pagina del manuale. Devo inserire tutte le conversioni possibili o qualcosa del genere? La mia mente debole la legge come "mappa di conversione". – darkAsPitch

+6

@darkAsPitch È complicato. '$ convmap' specifica quali caratteri codificare. Dovrebbe essere davvero una funzione di callback, ma probabilmente sarebbe lenta, e l'utilizzo di callback in php precede comunque la funzione. I primi due numeri specificano l'intervallo (incluso) dei codici carattere da convertire e il terzo e quarto e offset e una maschera di bit (0 e 0xfff per tutti gli scopi pratici). Ad esempio, se si desidera convertire tutti i caratteri in entità HTML, specificare 'array (0, 0xfff, 0, 0xfff)'. Fondamentalmente, '(0x80, 0xffff, ..)' è l'equivalente di 'charCode> 127' nella tua domanda. – phihag