Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Extraño error con acentos y eñes

Estas en el tema de Extraño error con acentos y eñes en el foro de Mysql en Foros del Web. Hola, he revisado el foro, de arriba abajo y no he encontrado la solución a mi problema. Os pongo en antecedentes. Trabajo haciendo una web ...
  #1 (permalink)  
Antiguo 29/07/2010, 09:54
 
Fecha de Ingreso: mayo-2010
Mensajes: 7
Antigüedad: 13 años, 10 meses
Puntos: 0
Extraño error con acentos y eñes

Hola, he revisado el foro, de arriba abajo y no he encontrado la solución a mi problema.

Os pongo en antecedentes. Trabajo haciendo una web en joomla que básicamente es un programa para llevar una gestión de gastos, ingresos y facturas muy básica.
Para realizarlo, todas las llamadas desde Joomla las realizo a través de un iframe, ya que todos los formularios, presentaciones en pantalla, etc. están en ficheros PHP independientes y externos a Joomla.
  • Todos los php incluyen: <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> en la cabecera.
  • La base de datos (MySQL) tiene codificación "utf8_general_ci", así como todos los campos de texto de las distintas tablas creadas (independientes de las de joomla).
  • Uso WampServer: Apache 2.2.11, PHP 5.3 y MySQL 5.1.36
  • Las llamadas desde php las realizo simplemente con un "echo $valor" o un "print($valor)"

Trabajo primero sobre un sitio exclusivo para los formularios, para provarlos rápidamente, y después los copio a el sitio que aloja Joomla para enlazarlos ya a los menús.
El acceso pues es idéntico, uno es localhost/fran y el de jommla localhost/franfacturacion, es decir, comparten todos los recursos, y la base de datos que uso es la misma en ambos casos.

Hasta hoy funcionaba igual, probase el php donde lo probase. Esta tarde ha cambiado:
  • La base de datos no guardaba los acentos y eñes, si no sus correspondientes códigos. Ahora, si inserto un nuevo campo desde "fran" sigue igual, pero al insertarlo con ese mismo formulario desde "franfacturación" se guardan en la base de datos los acentos y eñes.
  • Claro, ahora desde los formularios abiertos desde "fran" se ven correctamente todos los campos, pero si los abro desde "franfacturacion" no se muestran los acentos ni las eñes.

Como comprenderéis estoy muy despistado, si fallaran ambos, o funcionaran ambos como antes lo podría entender, pero que se comporten de distinta manera usando el mismo fichero php me tiene loco.

Agradecería que alguien arrojase algo de luz sobre el problema. De momento no es grave ya que todos los registros son de prueba y puedo eliminarlos, pero en pocos días tengo que subir la web a un servidor y tengo miedo de que allí se comporte de nuevo de otra forma y no entienda el por qué.

Gracias, Kike

Espero haberme expresado correctamente y que se haya entendido mi problema.
  #2 (permalink)  
Antiguo 29/07/2010, 10:10
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Extraño error con acentos y eñes

Dices:
Todos los php incluyen: <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> en la cabecera.
La base de datos (MySQL) tiene codificación "utf8_general_ci", así como todos los campos de texto de las distintas tablas creadas (independientes de las de joomla).

Dos detalles:
¿los archivos php están codificados en utf-8? Recuerda que son archivos de texto y tienen su codificación.

¿Cuando haces la conexión a la base en esos archivos PHP y antes de las consultas, usas SET NAMES='UTF-8'?

De todas formas, probablemente en el foro joomla puedan ofrecerte mejor ayuda.
  #3 (permalink)  
Antiguo 29/07/2010, 15:48
 
Fecha de Ingreso: mayo-2010
Mensajes: 7
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: Extraño error con acentos y eñes

hola Jurena, gracias por contestar, no sé a que te refieres con codificar los archivos php, lo único que podría hacer es colocar un header('Content-Type: text/html; charset=UTF-8'); Dado que el servidor es el mismo en ambos casos, no dpende del servidor apache la diferencia de codificación.

Probaré lo de SET NAMES, no, no lo tengo puesto.

Y en el foro de joomla no tiene sentido preguntar, ya que como te dije son externos y los cargo enbebidos en un iframe. De hecho si la llamada la hago fuera e joomla sucede lo mismo, es decir, en vez de llamarlos desde un menú de jommla, llamo directamente al fichero:
"localhost/franfacturacion/html/formularios/elquesea.php", lo de joomla es meramente anecdótico.

El problema es que el mismo formulario guardado en dos carpetas distintas se ejecuta de forma distinta, lee la base de distinta forma y guarda los registros de distinta forma y no tiene sentido para mi.

Suelo consultar solo cuando me atasco mucho , mucho, y como digo no me preocupa que se solucione con una codificación del fichero (que de todas formas me interesa saber a que te refieres, aprender siempre está bien) o con el SET NAMES, si no el por qué puede ocurrir lo que ocurre.

Al final lo subiré al servidor, funcionará y me olvidaré de este problema, pero es tan extraño que me gustaría saber si a alguien le ha pasado y si sabe la razón.

Un saludo,
Kike
  #4 (permalink)  
Antiguo 29/07/2010, 16:07
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Extraño error con acentos y eñes

el archivo php o html donde tienes el formulario debe tener una codificación utf8. Se trata de un archivo con terminación html o htm o php. Lo puedes ver con el editor que uses, incluso con el blog de notas, si, tras abrirlo co el blog de notas, seleccionas guardar como verás la codificación que tenías. En muchos casos es ANSI, un equivalente de ISO-8859-1, y eso suele causar problemas. Si cambias a UTF-8, y usas el SET NAMES ='UTF-8' antes de la consulta, le indicarás al servidor en qué codificación le envías la cadena y en qué codificación quieres que te la devuelva.
  #5 (permalink)  
Antiguo 30/07/2010, 03:19
 
Fecha de Ingreso: mayo-2010
Mensajes: 7
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: Extraño error con acentos y eñes

Ok, el block de notas me lo guarda como UTF8. Haré un php de prueba para ver si consigo saber porqué se producen esos cambios tan raros. Si llego a descubirlo lo postearé, pero como tengo que entregar el trabajo y rematar las css para el maldito ie no sé si le podré dedicar tiempo.

Gracias Jurena por el interés.

Kike
  #6 (permalink)  
Antiguo 30/07/2010, 13:35
 
Fecha de Ingreso: julio-2010
Mensajes: 10
Antigüedad: 13 años, 8 meses
Puntos: 0
Respuesta: Extraño error con acentos y eñes

Pues, como para aportar un poco nomas, estoy trabajando en un proyecto que teníamos los mismos problemas. En principio, solo con usar el
SET NAMES ='UTF-8'
no hizo falta cambiar la codificación de archivos, aunq varios no están en utf8 (los mios si, pero los de mi compañero de trabajo no). Igual, mientras no uses directamente caracteres especiales en el archivo, no tendrás problemas. O sea, si en lugar de usar una á, usas &aacute; o en lugar de un ñ, usas &ntilde;, al usar lo de SET NAMES = 'UTF-8", parece alcanzar, pero para estar tranquilo, todo en un utf-8 ayudará.

Aprovecho, ya que esta el tema, para sacarle un poco más de jugo :P y preguntar:
Porq es necesario el especificar este SET NAMES='UTF-8'? No debería alcanzar con especificar la codificación de la base de datos y usar esto sólo por si por alguna razón lo quiero guardar distinto? Me parece molesto y redundante cada vez que voy a guardar datos tener que setear esto para guardar en la codificación q ya eleji usar XD. Ojo, entiendo lo q hace SET NAMES, no entiendo porq no usa la q se elijio directamente para la base de datos.

Salu2
  #7 (permalink)  
Antiguo 30/07/2010, 14:41
 
Fecha de Ingreso: mayo-2010
Mensajes: 7
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: Extraño error con acentos y eñes

Pues a eso quizá pueda responder yo mismo, ya que me he estado mirando unas cuantas cosillas.
Por cierto, he puesto el SET NAMES en la función que me realiza la conexión a la base de datos y ya funcionan las dos igual. Sigo con el misterio, pero supongo que será una de esas cosas de la informática que vuelven a uno loco y no tienen una explicación fácil. Y no creo que merezca la pena matarse con ello.

Al crear un php enlazado a una base de datos especificas una serie de datos, algunos pueden omitirse y depende del navegador, servidor, y versiones funcionará como quieres o no, pero cada dato es distinto y necesario:
  • Al navegador que tipo de documento es:<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML........ para que sepa como tratarlo y que nivel de estándares debe respetar, aunque luego el IE haga lo que le venga en gana.
  • También le especificas que conjunto de caracteres debe enviar el servidor al cliente:<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Antes no se podían mostrar caracteres de diferentes idiomas en una web, con esta declaración abres el abanico de caracteres que se muestran. El utf-8 usa 8 bits para los caracteres, de forma que además de los ANSI engloba el resto de codificaciones en una sola.
  • Creas una base de datos y le dices el "formato" en que guardará los datos: Cotejamiento utf8-unicode-ci por ejemplo.
  • Pero cuando trabajas con un lenguaje que va a gestionar esa base de datos, debes especificarle también como relacionarse con ella, y entre este tipo de especificaciones está la de decirle que envíe y reciba los caracteres en utf-8: mysql_query ("SET NAMES 'utf8'");

Cada instrucción va destinada a distintos receptores, y de ahí que pueda parecer redundante.

Espero que sea así, después de leer tanto, lo he esquematizado todo y espero no haberme dejado nada importante que de lugar a dudas o errores de concepto
  #8 (permalink)  
Antiguo 31/07/2010, 00:54
 
Fecha de Ingreso: julio-2010
Mensajes: 10
Antigüedad: 13 años, 8 meses
Puntos: 0
Respuesta: Extraño error con acentos y eñes

mmm no digo que no sea como decis, pero si pienso que si la base de datos esta codificada en utf-8, y desde donde se manda tiene cabezeras que especifican que se usa utf-8, debería tomar esos datos en utf-8, no convertirlos por arte de magia en otra cosa para que se vean mal :P, incluso los archivos están codificados en utf-8 y encima hay q especificárselo nuevamente al mandar? Eso me parece demás. Porq entonces, dsp de todo, siempre en la vida q use utf-8 voy a tener que hacer el SET NAMES :S ?

Salu9
  #9 (permalink)  
Antiguo 31/07/2010, 03:55
 
Fecha de Ingreso: mayo-2010
Mensajes: 7
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: Extraño error con acentos y eñes

Como te decía, son cuestiones de estándares, no lo puse en el anterior post pero debería incluirse también el idioma de la página web.
Como sabrás, las comunicaciones entre "máquinas" se hace en binario, nuestra web pasa de texto a unos y ceros y después esos unos y ceros vuelven a caracteres. al especificar en la cabecera ese utf-8 pasa la codificación a binario en "bloques" de 8 bits (variable en el caso del utf-8 que va de 1 a 4 bytes) y también le dice que cuando al vuelva a "montar" lo haga tomando el binario en bloques de 8 bits, pero que algunos caracteres están representados por hasta 4 bytes.

Eso no tiene que ver con como se guardan en la base de datos los caracteres, ya que bien puedes usar un juego de caracteres checos en la misma, o chinos. Con SET NAMES le dices cual es la codificación de la base de datos. Es nuestro caso coindide, pero no necesariamente tiene porqué coincidir.

Así, si tienes tu documento en UTF8 y no le dices que lea la base en UTF8, la acabará leyendo en ANSI, que usa los 8 bits de su byte para representar los 256 caracteres posibles, y solo 8. Así una "á" leida de una base de datos codificada utf8 y leída en Ansi se muestra como dos caracteres, ya que en la base ocupa 16 bits y si no especificamos como leerla nos la leerá en bloques de 8 bits. El documento se seguirá mostrando en UTF8, pero el error se produce en la lectura de la base, no al mostrar los caracteres en pantalla.

Kike

Son dos cosas independientes. [URL="http://www.w3c.es/divulgacion/guiasbreves/internacionalizacion"]Aquí[/URL] puedes ver una breve explicación sobre internacionalización de documentos según el W3C
  #10 (permalink)  
Antiguo 31/07/2010, 04:25
 
Fecha de Ingreso: julio-2010
Mensajes: 10
Antigüedad: 13 años, 8 meses
Puntos: 0
Respuesta: Extraño error con acentos y eñes

Cita:
Con SET NAMES le dices cual es la codificación de la base de datos
Y eso es lo que no me convence del mecanismo (q por como se ve que funciona, debe ser como lo describiste). Ya se q puedo especificar guardar caracteres checos si quiero, y ahi me parece bien especificarlo... pero si voy a guardar utf-8, q ya es la codificacion de la base de datos, para q decirselo? viendolo distinto, si cada vez q voy a guardar o leer algo, tengo q decirle q es utf-8, para q me sirve la codificación de la base de datos?

De esta última pregunta mía, veo q quiza sirve para como lo guarda internamente pero solo a nivel ocupación (por la cantidad de datos) por q después cuando lo recupera, si no se lo especificas, lo recupera como se le canta (ANSI).

No digo q este demás la codificación de la base de datos, solo q me parece q si tiene una codificación, yo esperaría q la "use" por defecto, no encima tener q especificarsela, es un desproposito, porq para eso ni me preocupo como esta codificada la base de datos, solo me preocupo de usar SET NAMES y listo. Lo cual a su vez es molesto, por q con cada conexión a la base de datos hay q decirle.

Doy un ejemplo mundano. Este mecanismo, lo veo como si yo cada vez q posteo acá, arrancara el post diciendo: "Hola, yo hablo castellano como ustedes"... Para que? si es un foro por defecto en castellano, con gente q entiende castellano, para q lo diria cada vez q posteo? si, en caso d ir a uno de habla inglesa y querer hablar castellano, tendría q especificarlo para q no halla problemas :P

Bueno, recalco q todo esto es un parecer mio, q cuando afronte este problema, no me cerraba q haya q especificar siempre la codificación para en este caso, usar utf-8. Buscando no encontré lo contrario y hasta ahora de esta charla tampoco, así q de momento me quedo con q la implementación podría ser mejor (usando la codificación por defecto) pero no lo es.

Etiquetas: acentos, extraño, eñes
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:51.