2008-12-17 29 views
38

Algunos de mis scripts usan codificación diferente, y cuando intento combinarlos, esto se convierte en un problema.Convierte caracteres utf8 a iso-88591 y vuelve a PHP

Pero no puedo cambiar la codificación que utilizan, en vez quiero cambiar el encodig del resultado de la escritura A, y utilizarlo como parámetro en la escritura B.

Por lo tanto: ¿hay alguna forma sencilla de cambiar una cadena de UTF-8 a ISO-88591 en PHP? He consultado utf_encode y _decode, pero no hacen lo que quiero. ¿Por qué no existe ninguna función "utf2iso()", o similar?

No creo que tenga caracteres que no puedan escribirse en formato ISO, por lo que no debería ser un gran problema.

+1

utf8_decode debería ser exactamente tu utf2iso?!? – BlaM

+0

Vale la pena señalar que PHP continúa moviéndose a utf-8 internamente por lo que cualquier cadena que usted probablemente provenga del exterior. Establezca cURL, funciones de acceso a archivos, flujos, PDO/MySQL o cualquier otra API para acceder a datos externos para usar UTF-8 para que ya sea correcto cuando PHP lo obtenga. – Xeoncross

Respuesta

100

Eche un vistazo a iconv() o mb_convert_encoding(). A propósito: ¿por qué los utf8_encode() y utf8_decode() no funcionan para usted?

utf8_decode - Convierte una cadena con caracteres ISO-8859-1 codificado con UTF-8 a un solo byte ISO-8859-1

utf8_encode - Codifica un ISO-8859- 1 cadena en UTF-8

Así que, esencialmente

$utf8 = 'ÄÖÜ'; // file must be UTF-8 encoded 
$iso88591_1 = utf8_decode($utf8); 
$iso88591_2 = iconv('UTF-8', 'ISO-8859-1', $utf8); 
$iso88591_2 = mb_convert_encoding($utf8, 'ISO-8859-1', 'UTF-8'); 

$iso88591 = 'ÄÖÜ'; // file must be ISO-8859-1 encoded 
$utf8_1 = utf8_encode($iso88591); 
$utf8_2 = iconv('ISO-8859-1', 'UTF-8', $iso88591); 
$utf8_2 = mb_convert_encoding($iso88591, 'UTF-8', 'ISO-8859-1'); 

todos deben hacer lo mismo - con utf8_en/decode() que no requiere extensión especial, mb_convert_encoding() que requieren ext/mbstring y iconv() que requieren ext/iconv.

+0

Gracias por una buena respuesta, y usted y los otros aquí tienen razón: utf8_decode() parece hacer el trabajo. Debe haber habido algunos problemas con los archivos o mi navegador. Al menos ya no puedo reproducir los errores ... (¿Tal vez hice algo mal con la configuración del juego de caracteres de mi navegador?) – qualbeen

+0

Solo para que quede registrado: me enfrenté a una situación así, pero me di cuenta el iconov ha sido llamado dos veces (anidado) a la misma var var. Después de eliminar esa primera llamada, funciona como un amuleto. (utf8_decode y mb_convert_conconding no se han usado) – colares

+0

Este consejo me ayudó a resolver un problema peculiar donde una cuerda UTF-8 ("Atlántico") fue codificada literalmente por primera vez en ISO-8859-1 (parecía "Atlántica") y luego estos caracteres de un solo byte se volvieron a codificar a UTF-8 (se veía exactamente el mismo "Atlántico" pero cada carácter estaba codificado en UTF-8 esta vez). utf8_decode() ayudó porque decodificó los caracteres UTF-8 en sus sustitutos ANSI literales que de alguna manera misteriosamente fueron leídos y mostrados como caracteres UTF-8. ¿Tiene sentido o no? Hmm ... – Tyler

0

Necesita usar el paquete iconv, específicamente su función iconv.

5

Antes que nada, no use codificaciones diferentes. Lleva a un desastre, y UTF-8 es definitivamente el que deberías usar en todas partes.

Es probable que su entrada no sea ISO-8859-1, sino otra cosa (ISO-8859-15, Windows-1252). Para convertirlos, use iconv o mb_convert_encoding.

Sin embargo, utf8_encode y utf8_decode deberían funcionar para ISO-8859-1. Sería bueno si pudiera publicar un enlace a un archivo o una cadena de ejemplo uuencoded o base64 para la cual la conversión falla o produce resultados inesperados.

+0

iconv, o mb_convert_encoding? iconv requiere conocer la codificación de entrada, lo que podría no ser el caso. – Benubird

+0

@Benubird Si está adivinando la codificación, es probable que tenga problemas aún peores (ahora no es fácilmente reproducible, ya que puede depender de la frecuencia de los caracteres). Pero tienes razón, 'mb_convert_encoding' definitivamente pertenece a esta respuesta. Adicional. – phihag

+1

"Evitar cualquier codificación que no sea UTF8" es un buen consejo en general, pero a veces no es posible. Por ejemplo, estamos tratando de lograr una integración de terceros donde el partido exija XML en formato Latin 1. – GordonM

0

utilicé:

function utf8_to_html ($data) { 
    return preg_replace(
     array (
      '/ä/', 
      '/ö/', 
      '/ü/', 
      '/é/', 
      '/à/', 
      '/è/' 
     ), 
     array (
      'ä', 
      'ö', 
      'ü', 
      'é', 
      'à', 
      'è' 
     ), 
     $data 
    ); 
} 
0

puedo utilizar esta función:

function formatcell($data, $num, $fill=" ") { 
    $data = trim($data); 
    $data=str_replace(chr(13),' ',$data); 
    $data=str_replace(chr(10),' ',$data); 
    // translate UTF8 to English characters 
    $data = iconv('UTF-8', 'ASCII//TRANSLIT', $data); 
    $data = preg_replace("/[\'\"\^\~\`]/i", '', $data); 


    // fill it up with spaces 
    for ($i = strlen($data); $i < $num; $i++) { 
     $data .= $fill; 
    } 
    // limit string to num characters 
    $data = substr($data, 0, $num); 

    return $data; 
} 


echo formatcell("YES UTF8 String Zürich", 25, 'x'); //YES UTF8 String Zürichxxx 
echo formatcell("NON UTF8 String Zurich", 25, 'x'); //NON UTF8 String Zurichxxx 

Compruebe hacia fuera mi función en mi blog http://www.unexpectedit.com/php/php-handling-non-english-characters-utf8

-1
function parseUtf8ToIso88591(&$string){ 
    if(!is_null($string)){ 
      $iso88591_1 = utf8_decode($string); 
      $iso88591_2 = iconv('UTF-8', 'ISO-8859-1', $string); 
      $string = mb_convert_encoding($string, 'ISO-8859-1', 'UTF-8');  
    } 
} 
+4

Intenta agregar alguna explicación al código para mejorar el valor educativo de la publicación. –

1

conjunto de etiquetas META en la cabeza como

<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" /> 

utilice el enlace http://www.i18nqa.com/debug/utf8-debug.html para reemplazar el carácter de símbolos que desee.

luego usar str_replace como

$find = array('“', '’', '…', '—', '–', '‘', 'é', 'Â', '•', 'Ëœ', 'â€'); // en dash 
         $replace = array('“', '’', '…', '—', '–', '‘', 'é', '', '•', '˜', '”'); 
$content = str_replace($find, $replace, $content); 

Es el método que utilizo y ayudar mucho. ¡Gracias!

0

En mi caso, después de cargar los archivos con los nombres que contienen esos caracteres, ¡ni siquiera eran visibles con Filezilla! En el administrador de archivos Cpanel se les mostró? (bajo fondo negro). Y esta combinación hecho muestra correctamente en el navegador (documento HTML es-occidental codificado):

$dspFileName = utf8_decode(htmlspecialchars(iconv(mb_internal_encoding(), 'utf-8', basename($thisFile['path'])))); 
0

Es mucho mejor usar

valor $ = mb_convert_encode (valor $, 'HTML ENTIDADES' , 'UTF-8');

Especialmente cuando utiliza la llamada AJAX para enviar caracteres 'ISO-8859-1'. Funciona para chino, japonés, checo, alemán y muchos más idiomas.

0

Utilice html_entity_decode() y htmlentities().

$html = html_entity_decode(htmlentities($html, ENT_QUOTES, 'UTF-8'), ENT_QUOTES , 'ISO-8859-1'); 

htmlentities() formatea su entrada en la espalda a ISO-8859-1UTF8 y html_entity_decode() formatea.