update page now

utf8_encode

(PHP 4, PHP 5, PHP 7, PHP 8)

utf8_encodeConvierte una cadena ISO-8859-1 a UTF-8

Advertencia

Esta función está OBSOLETA a partir de PHP 8.2.0. Depender de esta función está altamente desaconsejado.

Descripción

#[\Deprecated]
utf8_encode(string $string): string

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-1 utilizan efectivamente una codificación similar a Windows-1252, y los navegadores web interpretarán las páginas web ISO-8859-1 como Windows-1252. Las características adicionales de Windows-1252 son caracteres imprimibles, tales como el signo euro () y las comillas curvas ( ), en lugar de algunos caracteres de control de ISO-8859-1. Esta función no convertirá estos caracteres Windows-1252 correctamente. Utilice una función diferente si se necesita una conversión Windows-1252.

Parámetros

string

Una cadena ISO-8859-1.

Valores devueltos

Devuelve la versión UTF-8 de string.

Historial de cambios

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.

Ejemplos

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

Notas

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
e282ac

Otras 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

Ver también

  • utf8_decode() - Convierte una string UTF-8 a ISO-8859-1, reemplazando los caracteres no válidos o no representables.
  • mb_convert_encoding() - Convertir una cadena de un codificación de caracteres a otra
  • UConverter::transcode() - Convierte una cadena de un juego de caracteres a otro
  • iconv() - Convierte una cadena de caracteres de un encodaje a otro

add a note

User Contributed Notes 3 notes

up
139
deceze at gmail dot com
14 years ago
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.
up
12
Aidan Kehoe <php-manual at parhasard dot net>
21 years ago
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);
}

?>
up
0
Mark AT modernbill DOT com
21 years ago
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.
To Top