(PHP 4, PHP 5, PHP 7, PHP 8)
utf8_encode — Convierte una cadena ISO-8859-1 a UTF-8
Esta función está OBSOLETA a partir de PHP 8.2.0. Depender de esta función está altamente desaconsejado.
Esta función convierte la cadena string desde
la codificación ISO-8859-1 a UTF-8.
Nota:
Esta función no intenta adivinar la codificación actual de la cadena de caracteres proporcionada, asume que está codificada en ISO-8859-1 (también conocido como "Latin 1") y la convierte a UTF-8. Dado que cada secuencia de bytes es una cadena de caracteres ISO-8859-1 válida, nunca habrá errores, pero no resultará en una cadena de caracteres útil si se esperaba una codificación diferente.
Muchas páginas web marcadas como que utilizan la codificación de caracteres
ISO-8859-1utilizan efectivamente una codificación similar aWindows-1252, y los navegadores web interpretarán las páginas webISO-8859-1comoWindows-1252. Las características adicionales deWindows-1252son caracteres imprimibles, tales como el signo euro (€) y las comillas curvas (""), en lugar de algunos caracteres de control deISO-8859-1. Esta función no convertirá estos caracteresWindows-1252correctamente. Utilice una función diferente si se necesita una conversiónWindows-1252.
stringUna cadena ISO-8859-1.
Devuelve la versión UTF-8 de string.
| Versión | Descripción |
|---|---|
| 8.2.0 | Esta función ha sido declarada obsoleta. |
| 7.2.0 | Esta función fue movida al núcleo de PHP, anteriormente, era necesario instalar la extensión XML para utilizarla. |
Ejemplo #1 Ejemplo de uso
<?php
// Convierte la cadena 'Zoë' de ISO 8859-1 a UTF-8
$iso8859_1_string = "\x5A\x6F\xEB";
$utf8_string = utf8_encode($iso8859_1_string);
echo bin2hex($utf8_string), "\n";
?>El ejemplo anterior mostrará:
5a6fc3ab
Nota: Obsolescencia y alternativas
Esta función está obsoleta a partir de PHP 8.2.0 y será eliminada en una versión futura. Los usos existentes deberían ser verificados y reemplazados por alternativas apropiadas.
Una funcionalidad similar puede ser obtenida con mb_convert_encoding() , que soporta ISO-8859-1 y muchos otros juegos de caracteres.
<?php $iso8859_1_string = "\xEB"; // 'ë' (e con diéresis) en ISO-8859-1 $utf8_string = mb_convert_encoding($iso8859_1_string, 'UTF-8', 'ISO-8859-1'); echo bin2hex($utf8_string), "\n"; $iso8859_7_string = "\xEB"; // la misma cadena en ISO-8859-7 representa 'λ' (lambda minúscula griega) $utf8_string = mb_convert_encoding($iso8859_7_string, 'UTF-8', 'ISO-8859-7'); echo bin2hex($utf8_string), "\n"; $windows_1252_string = "\x80"; // '€' (signo euro) en Windows-1252, pero no en ISO-8859-1 $utf8_string = mb_convert_encoding($windows_1252_string, 'UTF-8', 'Windows-1252'); echo bin2hex($utf8_string), "\n"; ?>El ejemplo anterior mostrará:
c3ab cebb e282acOtras opciones pueden estar disponibles dependiendo de las extensiones instaladas, tales como UConverter::transcode() y iconv() .
Los siguientes ejemplos dan todos el mismo resultado:
<?php $iso8859_1_string = "\x5A\x6F\xEB"; // 'Zoë' en ISO-8859-1 $utf8_string = utf8_encode($iso8859_1_string); echo bin2hex($utf8_string), "\n"; $utf8_string = mb_convert_encoding($iso8859_1_string, 'UTF-8', 'ISO-8859-1'); echo bin2hex($utf8_string), "\n"; $utf8_string = UConverter::transcode($iso8859_1_string, 'UTF8', 'ISO-8859-1'); echo bin2hex($utf8_string), "\n"; $utf8_string = iconv('ISO-8859-1', 'UTF-8', $iso8859_1_string); echo bin2hex($utf8_string), "\n"; ?>El ejemplo anterior mostrará:
5a6fc3ab 5a6fc3ab 5a6fc3ab 5a6fc3ab
Please note that utf8_encode only converts a string encoded in ISO-8859-1 to UTF-8. A more appropriate name for it would be "iso88591_to_utf8". If your text is not encoded in ISO-8859-1, you do not need this function. If your text is already in UTF-8, you do not need this function. In fact, applying this function to text that is not encoded in ISO-8859-1 will most likely simply garble that text.
If you need to convert text from any encoding to any other encoding, look at iconv() instead.Here's some code that addresses the issue that Steven describes in the previous comment;
<?php
/* This structure encodes the difference between ISO-8859-1 and Windows-1252,
as a map from the UTF-8 encoding of some ISO-8859-1 control characters to
the UTF-8 encoding of the non-control characters that Windows-1252 places
at the equivalent code points. */
$cp1252_map = array(
"\xc2\x80" => "\xe2\x82\xac", /* EURO SIGN */
"\xc2\x82" => "\xe2\x80\x9a", /* SINGLE LOW-9 QUOTATION MARK */
"\xc2\x83" => "\xc6\x92", /* LATIN SMALL LETTER F WITH HOOK */
"\xc2\x84" => "\xe2\x80\x9e", /* DOUBLE LOW-9 QUOTATION MARK */
"\xc2\x85" => "\xe2\x80\xa6", /* HORIZONTAL ELLIPSIS */
"\xc2\x86" => "\xe2\x80\xa0", /* DAGGER */
"\xc2\x87" => "\xe2\x80\xa1", /* DOUBLE DAGGER */
"\xc2\x88" => "\xcb\x86", /* MODIFIER LETTER CIRCUMFLEX ACCENT */
"\xc2\x89" => "\xe2\x80\xb0", /* PER MILLE SIGN */
"\xc2\x8a" => "\xc5\xa0", /* LATIN CAPITAL LETTER S WITH CARON */
"\xc2\x8b" => "\xe2\x80\xb9", /* SINGLE LEFT-POINTING ANGLE QUOTATION */
"\xc2\x8c" => "\xc5\x92", /* LATIN CAPITAL LIGATURE OE */
"\xc2\x8e" => "\xc5\xbd", /* LATIN CAPITAL LETTER Z WITH CARON */
"\xc2\x91" => "\xe2\x80\x98", /* LEFT SINGLE QUOTATION MARK */
"\xc2\x92" => "\xe2\x80\x99", /* RIGHT SINGLE QUOTATION MARK */
"\xc2\x93" => "\xe2\x80\x9c", /* LEFT DOUBLE QUOTATION MARK */
"\xc2\x94" => "\xe2\x80\x9d", /* RIGHT DOUBLE QUOTATION MARK */
"\xc2\x95" => "\xe2\x80\xa2", /* BULLET */
"\xc2\x96" => "\xe2\x80\x93", /* EN DASH */
"\xc2\x97" => "\xe2\x80\x94", /* EM DASH */
"\xc2\x98" => "\xcb\x9c", /* SMALL TILDE */
"\xc2\x99" => "\xe2\x84\xa2", /* TRADE MARK SIGN */
"\xc2\x9a" => "\xc5\xa1", /* LATIN SMALL LETTER S WITH CARON */
"\xc2\x9b" => "\xe2\x80\xba", /* SINGLE RIGHT-POINTING ANGLE QUOTATION*/
"\xc2\x9c" => "\xc5\x93", /* LATIN SMALL LIGATURE OE */
"\xc2\x9e" => "\xc5\xbe", /* LATIN SMALL LETTER Z WITH CARON */
"\xc2\x9f" => "\xc5\xb8" /* LATIN CAPITAL LETTER Y WITH DIAERESIS*/
);
function cp1252_to_utf8($str) {
global $cp1252_map;
return strtr(utf8_encode($str), $cp1252_map);
}
?>If you haven't guessed already: If the UTF-8 character has no representation in the ISO-8859-1 codepage, a ? will be returned. You might want to wrap a function around this to make sure you aren't saving a bunch of ???? into your database.