8

Todos sabemos los problemas que generan los acentos en las páginas web:

introducir la descripción de la imagen aquí

Y sé que con las funciones utf8_encode y utf8_decode de php se pueden arreglar (cuando utilizas un echo por ejemplo).

Tengo una duda sobre cuando usar utf8_encode o utf8_decode en php ya que hasta hora siempre lo he hecho probando de uno a otro y viendo si funcionaba. Si no funcionaba utf8_encode usaba utf8_decode y viceversa.

Se que está relacionado con la ISO-8859-1 pero no sé cuando usar uno u otro.

Entiendo que dependerá del servidor en el que se esté ejecutando pero... ¿Hay alguna forma de saber cual usar que no sea cambiando de uno a otro?

Muchas gracias.

Francisco Romero
  • 16,194
  • 5
  • 30
  • 61
  • 1
    Desde que se crea en memoria un string hasta que se renderiza en pantalla, la codificación puede cambiar. Hay varios actores que influyen en la codificación de ese string: codificación de la base de datos (si el string proviene de ahí), codificación de php (default_charset en php.ini), codificación del fichero fuente .php (si el string se crea ahí), codificación de la respuesta HTTP, codificación del fichero HTML... Lo ideal es que todos estos actores que pueden modificarte la codificación usen la misma (mejor utf-8 que iso si es posible) de esta manera no necesitas ninguna de esas funciones. – ordago Mar 18 '20 at 07:28
  • 1
    A lo que voy, es que esas funciones se deberían usar, si al pasar alguna de esas fronteras es necesario obligatoriamente un cambio de codificación, no debería ser un mecanismo de prueba/error para hacer que se vea bien un string. Un ejemplo podría ser si trabajamos en general con utf-8 pero hacemos uso de un servicio web que devuelve los datos en iso-8859-1. Ahí no nos queda otra que usar utf8_encode para codificar esa respuesta a nuestra codificación. – ordago Mar 18 '20 at 07:31

4 Answers4

5

Buenas Error404! Me parece una pregunta acertada, ya que yo hace tiempo también me planteé una parecida.
Contestaré lo mejor que pueda con las conclusiones que he sacado de mi experiencia personal y sin contrastarlas 100% con fuentes fiables

Por lo que tengo entendido, en el entorno web, creo que no hay apenas diferencia. Da igual que sea utf8_encode o utf8_decode.

El principal problema de estas codificaciones, viene cuando estás tocando Bases de datos (que en php suele ser lo habitual). Ya que tienes que poner utf8_decode si no a la hora de llamar los datos, estos te llegarán así: Piña => Piña.

Por otro lado, mas que codificación, parecen métodos y yo me lo imagino así:

utf8_encode("Mañana toca programación"); → Mañana toca programación
utf8_decode("Mañana toca programación"); → Mañana toca programación

No estoy seguro de haber solucionado tu duda, aunque espero que alguien con mas conocimientos que yo, responda porque también tengo alguna que otra duda.

rencinas
  • 1,267
  • 11
  • 29
  • 1
    Te la voto como positiva ya que es más o menos lo que yo había visto hasta ahora (sí, también he tenido el problema con las bases de datos muchas veces). Esperemos que alguien con algo más de conocimientos nos pueda decir de manera concisa cuando debemos usar un método u otro. Por desgracia no parece que de momento tenga mucha repercusión la pregunta :( – Francisco Romero Oct 25 '16 at 11:14
3

utf8_encode y utf8_decode son nombres un poco inapropiados. Lo único que estas funciones hacen es convertir entre las codificaciones UTF-8 e ISO-8859-1. Hacen exactamente lo mismo que iconv("UTF-8", "ISO-8859-1", $text) e iconv("ISO-8859-1", "UTF-8", $text) respectivamente. No hay alguna razón que exija su uso.

Si recibes una cadena codificada en UTF-8 desde el navegador y quieres guardarla en la base de datos codificada con el conjunto de caracteres UTF-8 no es necesaria ninguna de las funciones, ya que no estarías transformando nada.

Podrías utilizar cualquiera de las funciones si necesitas convertir de UTF-8 a ISO-8859-1 o viceversa en cualquier momento, debido a que los datos externos están codificados en alguna de estás codificaciones, o un sistema externo espera que los datos estén codificados en alguna de estás codificaciones.

Para más información acerca de codificaciones puedes revisar los siguientes enlaces:

Juan Pinzón
  • 9,007
  • 18
  • 48
  • 76
2

Yo di mil vueltas, me imprimía con un simbolito las ñ y al cambiar utf8_decode por utf8_encode, me dí cuenta que me pasaba mi codígo a Iso, entonces lo que hice (No se si es lo correcto pero me funcionó) fue

utf8_encode(utf8_decode($Variable['campo']))

Espero que a alguien mas le sirva.

Roger Torné
  • 7,317
  • 12
  • 17
  • 31
Nestor
  • 21
  • 1
  • ¿Por qué haces un decode de algo que no es un json? con esto valdria no? utf8_encode($Variable['campo']) – Rddevelop Mar 18 '20 at 11:39
0

Ami me funciono correctamente el codigo de la siguiente manera

<td>". resaltar_frase(utf8_encode(utf8_decode($row['a_paterno']))."</td>
Dario Hj
  • 21
  • 2