2010-07-12 49 views
8

Necesito convertir texto en UTF-8 en texto codificado en ISO-8859-1 de manera que cualquier carácter que no forme parte del conjunto ISO-8859-1 se convierta en referencias de caracteres. (Ex β)Convierte utf8 a latin1 en PHP. Todos los caracteres superiores a 255 se convierten en referencias de caracteres

Ejemplo: Quiero convertir texto como

hello é β 水 

en

hello é β 水 

que estoy haciendo todo esto en PHP. Probé las funciones integradas, iconv, ordenadas y combinadas, y aún no puedo obtener una solución confiable.

Esto es lo que tengo hasta ahora

// convert any characters fount in the entity table into HTML entities 
// do not double encode entities, do not mess with quotes 
// use UTF-8 as character encoding because the page submits UTF-8 
$str = htmlentities($str,ENT_NOQUOTES,'UTF-8',false); 
//print $str."\n"; 

// convert text from UTF-8 to ISO-8859-1, 
// characters that cannot be converted will be converted to ? 
$str = utf8_decode($str); 
//print $str."\n";  

// make string XML valid. 
// mainly it converts text entities into numeric entities. 
$opts = array( "output-xhtml"  => true, 
      "output-xml"  => true, 
      "show-body-only" => true, 
      "numeric-entities" => true, 
      "wrap"    => 0, 
      "indent"   => false, 
      "char-encoding" => 'latin1' 
     ); 
$tidy = tidy_parse_string($str, $opts,'latin1'); 
tidy_clean_repair($tidy); 
$str = tidy_get_output($tidy);  
//print $str."\n"; 
+0

usando 'htmlentities ('hola é β 水', ENT_COMPAT, ' UTF-8 ') 'podría convertir al menos el' é' y el 'β' en entidades HTML (entidades con nombre). ¿Esto es suficiente? – NikiC

+0

Por supuesto, esto no es suficiente. El último personaje es el principal problema aquí. Por favor no, que las entidades no están permitidas en el resultado final (datos XML) y quiero que ISO-8859-1 se mantenga como caracteres. –

Respuesta

11

que necesitará el apoyo de varios bytes. En particular, mb_encode_numericentity():

$convmap= array(0x0100, 0xFFFF, 0, 0xFFFF); 
$encutf= mb_encode_numericentity($utf, $convmap, 'UTF-8'); 
$iso= utf8_decode($encutf); 

(Esto no toca <, &, " etc por lo que también puede necesitar htmlspecialchars() de antemano.)

+0

Muchas gracias. No sé cómo no he notado estas funciones antes. –

+0

Bueno, lamentablemente, las funciones de mb no formaban parte de la compilación predeterminada, por lo que no siempre han estado disponibles en todas partes. Sin embargo, esperaría verlos en la mayoría de los servidores hoy en día. – bobince

+0

Gracias. Funciona a las mil maravillas. –

Cuestiones relacionadas