utf8_encode()
La función utf8_encode() convierte una cadena de ISO-8859-1 a UTF-8 en PHP. Está obsoleta en PHP 8.2 y eliminada en PHP 8.3.
La función utf8_encode() es una función integrada de PHP que convierte una cadena de la codificación ISO-8859-1 (Latin-1) a UTF-8. Es útil cuando recibes texto Latin-1 — de una base de datos heredada, un archivo o una API antigua — y necesitas que se muestre correctamente en un sistema que espera UTF-8.
Esta página explica qué hace la función, cómo funciona a nivel de bytes, cuándo (y cuándo no) usarla, y los reemplazos modernos que deberías preferir en las versiones actuales de PHP.
Obsoleta y luego eliminada.
utf8_encode()fue obsoleta en PHP 8.2 y eliminada en PHP 8.3. El código nuevo debería usarmb_convert_encoding()oiconv()en su lugar — consulta Reemplazos modernos más abajo. Esta página documenta la función heredada para los muchos proyectos que aún dependen de ella.
Qué significa "codificación" aquí
Una codificación de caracteres es un mapeo entre caracteres y los bytes que los representan. ISO-8859-1 es una codificación de un solo byte: cada carácter ocupa exactamente un byte (256 valores posibles), lo que cubre letras de Europa occidental como é, ñ y ü. UTF-8 es una codificación de ancho variable donde esos mismos caracteres acentuados ocupan dos bytes.
utf8_encode() hace un trabajo específico: lee cada byte de la entrada como un punto de código ISO-8859-1 y lo reescribe como la secuencia de bytes UTF-8 equivalente. No detecta la codificación de la entrada — siempre asume que la entrada es ISO-8859-1. Si le pasas una cadena que ya está en UTF-8, obtendrás una salida con "mojibake" (doble codificación).
Sintaxis
utf8_encode(string $string): string| Parámetro | Descripción |
|---|---|
$string | La cadena codificada en ISO-8859-1 (Latin-1) a convertir. |
Valor de retorno: el mismo texto recodificado como UTF-8.
Ejemplos de uso
Veamos algunos ejemplos prácticos del uso de utf8_encode() en PHP.
Ejemplo 1: Convertir texto ISO-8859-1 a UTF-8
Supongamos que tienes una cadena con codificación ISO-8859-1 que deseas convertir a UTF-8. Puedes usar utf8_encode() para hacerlo:
Este código define una variable string $text con texto ISO-8859-1, la convierte a UTF-8 con utf8_encode() y muestra el resultado. Ten en cuenta la advertencia del comentario: la cadena fuente debe ser realmente ISO-8859-1. Si tu editor guarda el archivo como UTF-8, la é ya ocupa dos bytes y utf8_encode() la convertirá en é.
Ejemplo 2: Ver el cambio a nivel de bytes
Para hacer la conversión más concreta, inspecciona la longitud en bytes antes y después. El carácter acentuado pasa de un byte a dos:
<?php
$latin1 = "\xE9"; // a single byte: 'é' in ISO-8859-1
echo strlen($latin1); // 1
$utf8 = utf8_encode($latin1);
echo strlen($utf8); // 2 -> the bytes 0xC3 0xA9
echo bin2hex($utf8); // c3a9
?>strlen() cuenta bytes, no caracteres, por lo que la misma letra reporta una longitud de 1 en Latin-1 y 2 en UTF-8. Esta expansión de un byte a dos es exactamente lo que hace que el texto convertido se muestre correctamente en un contexto UTF-8.
Ejemplo 3: Convertir texto codificado en ISO-8859-1 desde XML
Supongamos que tienes un archivo XML declarado como ISO-8859-1 que deseas leer y convertir a UTF-8. Puedes usar la biblioteca SimpleXML para leer el archivo y utf8_encode() para convertir cada valor:
<?php
$xml = simplexml_load_file("data.xml");
foreach ($xml->item as $item) {
$title = utf8_encode($item->title);
$description = utf8_encode($item->description);
echo "$title: $description\n";
}
?>Este código carga un archivo XML declarado como ISO-8859-1 con simplexml_load_file(), itera sobre cada elemento <item>, y convierte el texto de <title> y <description> a UTF-8 antes de mostrarlo. (Los valores SimpleXMLElement son convertidos a string por utf8_encode().)
Cuándo usarla (y cuándo no)
Usa utf8_encode() solo cuando todas estas condiciones se cumplan:
- La entrada es genuinamente ISO-8859-1 / Latin-1 (no Windows-1252, ni ya UTF-8).
- Estás en PHP 8.2 o anterior, donde la función aún existe.
- Quieres una conversión rápida de Latin-1 → UTF-8 sin dependencias externas.
Evítala cuando:
- La fuente podría ser Windows-1252 (común en texto de Windows / Excel). Windows-1252 reutiliza el rango
0x80–0x9Fpara caracteres como€y comillas tipográficas que ISO-8859-1 deja sin definir — esos se perderán o quedarán mal. Usamb_convert_encoding($s, 'UTF-8', 'Windows-1252')en su lugar. - No conoces realmente la codificación de la entrada. Detéctala o declárala explícitamente en lugar de adivinar.
- Tu objetivo es PHP 8.3+, donde la función ha sido eliminada por completo.
Reemplazos modernos
Dado que utf8_encode() fue eliminada en PHP 8.3, prefiere las funciones de cadenas multibyte o iconv, que te permiten nombrar explícitamente la codificación de origen:
<?php
$latin1 = "\xE9"; // 'é' in ISO-8859-1
// mbstring extension (recommended)
$utf8 = mb_convert_encoding($latin1, 'UTF-8', 'ISO-8859-1');
// iconv extension
$utf8 = iconv('ISO-8859-1', 'UTF-8', $latin1);
echo bin2hex($utf8); // c3a9 in both cases
?>Ambas producen los mismos dos bytes (0xC3 0xA9) que utf8_encode(), pero hacen que la codificación de origen forme parte de la llamada — por lo que también funcionan con Windows-1252, ISO-8859-15 y docenas de otras codificaciones.
Funciones relacionadas
utf8_decode()— la función inversa: convierte UTF-8 de vuelta a ISO-8859-1.json_encode()— produce salida UTF-8 y escapa los caracteres multibyte.- Cadenas en PHP — descripción general del trabajo con texto en PHP.
Conclusión
utf8_encode() convierte texto ISO-8859-1 (Latin-1) a UTF-8 recodificando cada byte — transformando los caracteres acentuados de un solo byte en su forma UTF-8 de dos bytes. Es conveniente pero no detecta la codificación real de la entrada, y está obsoleta en PHP 8.2 y eliminada en PHP 8.3. Para cualquier código nuevo, usa mb_convert_encoding() o iconv(), que te permiten especificar la codificación de origen explícitamente y manejan una gama mucho más amplia de conjuntos de caracteres.