W3docs

utf8_decode()

La función utf8_decode() convierte cadenas de codificación UTF-8 a ISO-8859-1 en PHP. Aprende su sintaxis, ejemplos y alternativas modernas.

La función utf8_decode() es una función integrada de PHP que convierte una cadena de codificación UTF-8 a ISO-8859-1 (también llamada Latin-1). UTF-8 puede representar todos los caracteres Unicode, mientras que ISO-8859-1 es una codificación de un solo byte que solo cubre los primeros 256 puntos de código Unicode (letras de Europa occidental, dígitos y signos de puntuación).

Esta página explica qué hace utf8_decode(), cuándo realmente la necesitas, el reemplazo moderno y cómo se comporta con caracteres que están fuera de ISO-8859-1.

Cuándo (y si) usarla

Solo necesitas utf8_decode() cuando vas a enviar texto UTF-8 a un sistema antiguo que solo entiende ISO-8859-1 — por ejemplo, una columna de base de datos heredada, un informe de ancho fijo o una API de terceros anterior a Unicode. Para cualquier cosa nueva, mantén tus datos en UTF-8 de extremo a extremo y nunca necesitarás esta función.

Advertencia

utf8_decode() está obsoleta desde PHP 8.2 y se eliminará en una versión futura. Reemplázala con mb_convert_encoding($string, 'ISO-8859-1', 'UTF-8') (la extensión mbstring) o iconv('UTF-8', 'ISO-8859-1', $string). La conversión inversa la realiza utf8_encode().

Una limitación clave: ISO-8859-1 no tiene espacio para caracteres como , , emojis o cualquier script no latino. Cuando utf8_decode() encuentra un carácter que no puede representar, lo reemplaza con un signo de interrogación (?) — el carácter original se pierde. Por eso la función es con pérdida y por qué mantener el texto en UTF-8 es casi siempre la mejor opción.

Sintaxis

La sintaxis de la función utf8_decode() es la siguiente:

utf8_decode(string $string): string
ParámetroDescripción
$stringLa cadena codificada en UTF-8 a convertir a ISO-8859-1.

Valor de retorno: la cadena ISO-8859-1 convertida. Los bytes que no son UTF-8 válido y los caracteres que no tienen equivalente en ISO-8859-1 se convierten en un signo de interrogación (?).

Ejemplos de uso

Veamos algunos ejemplos prácticos del uso de utf8_decode() en PHP.

Ejemplo 1: Conversión de texto codificado en UTF-8 a ISO-8859-1

La cadena "Zoë" se almacena en tu script como UTF-8, donde la ë ocupa dos bytes (c3 ab). Tras la decodificación, ë se convierte en el byte ISO-8859-1 único eb. Imprimimos los bytes sin procesar con bin2hex() para que el cambio a nivel de bytes sea visible:

Conversión de texto codificado en UTF-8 a ISO-8859-1 en PHP

php— editable, runs on the server

La salida es:

5a6feb

Los cuatro bytes UTF-8 (Z, o y la ë de dos bytes) se reducen a tres bytes ISO-8859-1: 5a (Z), 6f (o) y eb (ë). La cadena ahora tiene un byte menos porque el carácter acentuado se codifica en un solo byte en lugar de dos.

Ejemplo 2: Caracteres que no se pueden representar

Dado que ISO-8859-1 solo tiene 256 puntos de código, cualquier carácter fuera de ese rango se pierde. El signo del euro () es un ejemplo clásico — no existe en Latin-1:

<?php

echo utf8_decode("Price: €5");  // Price: ?5

?>

El se reemplaza con ?. Si necesitas preservar caracteres como este, no conviertas a ISO-8859-1 — mantén el texto en UTF-8 o usa una codificación de destino más rica.

Ejemplo 3: Lectura de texto UTF-8 desde XML

SimpleXML siempre analiza XML como UTF-8. Si debes pasar ese texto a un sistema Latin-1, decodifica cada valor mientras lo lees con simplexml_load_file():

Conversión de texto codificado en UTF-8 desde XML en PHP

<?php

$xml = simplexml_load_file("data.xml");
foreach ($xml->item as $item) {
    $title = utf8_decode((string) $item->title);
    $description = utf8_decode((string) $item->description);
    echo "$title: $description\n";
}

?>

Este código carga data.xml, recorre cada elemento <item> y decodifica el texto de <title> y <description> de UTF-8 a ISO-8859-1. Convertir cada nodo a (string) primero transforma el SimpleXMLElement en una cadena simple antes de decodificarla.

Para que este ejemplo funcione, data.xml debe contener una estructura como esta:

<root>
  <item>
    <title>Example Title</title>
    <description>Example Description</description>
  </item>
</root>

Conclusión

utf8_decode() convierte texto UTF-8 a ISO-8859-1, descartando cualquier carácter que Latin-1 no pueda representar. Es útil para comunicarse con sistemas heredados, pero está obsoleta en PHP 8.2+ y es con pérdida, por lo que es preferible usar mb_convert_encoding() o iconv() y mantener los datos en UTF-8 siempre que sea posible.

Para ir en la dirección opuesta, consulta utf8_encode(). Para saber más sobre el trabajo con texto en PHP, consulta la referencia de funciones de cadena de PHP.

Práctica

Práctica
¿Qué hace la función utf8_decode en PHP?
¿Qué hace la función utf8_decode en PHP?
Was this page helpful?