2011-09-30 31 views
13

¿Es posible una traducción del código siguiente utilizando PHP?Cómo convertir caracteres UTF8 a entidades de caracteres numéricos en PHP

El siguiente código está escrito en JavaScript. Devuelve html con referencias de caracteres numéricos donde sea necesario. Ex. smslån -> smslån

No he podido crear una traducción. This script parecía que podría funcionar, pero devuelve å para å en lugar de å como Javascript a continuación hace.

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 suena como lo hace la misma cosa que charCodeAt, pero no es así. Obtengo para å usando ord y usando charCodeAt. Eso, o estoy teniendo algunos problemas de codificación increíblemente difíciles.

+0

¿Quiere decir [esto?] (Http://www.php.net/manual/en/function.mb-encode-numericentity.php#88586), o la respuesta de phihag a continuación, básicamente? No veo una versión utf8 de ord en ninguna parte. – darkAsPitch

+0

No estoy seguro. Intenté jugar con el código de Miguel durante 20 minutos, pero parece que lo que Phihag a continuación sugirió es exactamente lo que necesitaba. En términos de esta aplicación de todos modos. ¿Hay alguna razón para creer que no es así? – darkAsPitch

Respuesta

32

Uso mb_encode_numericentity:

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

Sí, aunque quería responder, vi que ya lo hiciste, así que me di cuenta. ;) Es realmente una función genial para el trabajo. – hakre

+3

Lo único que me preocupa es que $ convmap, ¿qué es eso exactamente? No hay una gran explicación en la página del manual. ¿Tengo que ingresar todas las conversiones posibles o algo así? Mi mente débil lo lee como "mapa de conversión". – darkAsPitch

+6

@darkAsPitch Es desordenado. '$ convmap' especifica qué caracteres codificar. Realmente debería ser una función de devolución de llamada, pero eso probablemente sería lento, y el uso de devoluciones de llamadas en php es anterior a la función. Los primeros dos números especifican el rango (inclusive) de los códigos de caracteres para convertir, y el tercero y cuarto y el desplazamiento y una máscara de bits (0 y 0xfff para todos los propósitos prácticos). Por ejemplo, si quiere convertir todos los caracteres a entidades HTML, especifique 'array (0, 0xfff, 0, 0xfff)'. Básicamente, '(0x80, 0xffff, ..)' es el equivalente de 'charCode> 127' en tu pregunta. – phihag

Cuestiones relacionadas