Autor Tema: Graves Problemas UTF-8  (Leído 2151 veces)

Desconectado ryksz

  • PHPerit@
  • *
  • Mensajes: 3
  • Karma: 0
  • Nuev@ PHPer@
    • Ver Perfil
Graves Problemas UTF-8
« en: 05 de Octubre de 2011, 00:41:48 am »
Saludos!
Tuve Problemas hace poco, pues usaba el charset= iso-8895-1 en mis documentos HTML, ya que AJAX trabaja con UTF-8 (o eso creo entender) y los resultados que traía no venían con caracteres como"ñ", "ç", o acentos. Haciendo pruebas el día de hoy cree esta página:

Código: [Seleccionar]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
<script type="text/javascript">

function crearAjax()
{
var xmlhttp = false;

if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
 
  return xmlhttp;
}

function buscaNombre(nombre)
{
if(nombre=="")
{
document.getElementById('mostrar').innerHTML="";
return;
}
Pedido=crearAjax();
Pedido.open('GET','qry/res.php?q='+nombre,true);
Pedido.onreadystatechange=function()
{
if(Pedido.readyState==4 && Pedido.status==200)
{
document.getElementById('mostrar').innerHTML=decodeURIComponent(Pedido.responseText);
}
}
//decodeURIComponent(Pedido
Pedido.send();
}

</script>
</head>

<body>

 <form action="" method="post">
  <label>Nombre</label>
  <?php
   
include(&#39;qry/db.php&#39;);
   
$query="SELECT * FROM empleados";
   
$result=DBExecute($query,$link,1);
  
?>

 
  <select id="nom" onchange="buscaNombre(this.value)">
   <?php while($row=mysql_fetch_row($result)){echo"<option value=&#39;$row[1]&#39;>$row[1]</option>";} ?>
  </select>
  <br />
 </form>

<div id="mostrar">
 <?php include(&#39;qry/res.php&#39;); ?>
</div>

</body>
</html>

Los resultados siguen sin traer caracteres especiales a pesar de estar usando  utf-8 y con UTF-8 ni siquierea los trae al hacer un query sin uso de  ajax, para eso he de usar UTF-8-ci o volver a iso-8895-1...

No sé que puedo estar haciendo mal, y estoy a poco de volarme la cabeza  :( alguien me puede dar algún consejo?? :confused:  gracias

este es el sql de la base de datos
Código: [Seleccionar]
-- phpMyAdmin SQL Dump
-- version 3.3.9
-- http://www.phpmyadmin.net
--
-- Servidor: localhost
-- Tiempo de generación: 04-10-2011 a las 17:30:19
-- Versión del servidor: 5.5.8
-- Versión de PHP: 5.3.5

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

--
-- Base de datos: `prueb`
--

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `empleados`
--

CREATE TABLE IF NOT EXISTS `empleados` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `nombre` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
  `apellido` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=9 ;

--
-- Volcar la base de datos para la tabla `empleados`
--

INSERT INTO `empleados` (`id`, `nombre`, `apellido`) VALUES
(1, 'Arturo', 'Ramirez'),
(3, 'Alba', 'Ramirez'),
(5, 'Diana', 'No sé'),
(7, 'ççç', 'ño');

y este el archivo res.php
Código: [Seleccionar]
<?php
 
include(&#39;db.php&#39;);
 
 
 
$query="SELECT apellido FROM empleados WHERE nombre=&#39;$q&#39;";
 
$result=DBExecute($query,$link,1);
 echo
"
 <table>
 <tr>
 <th>Apellido</th>
 <tr>"
;
 while(
$row=mysql_fetch_row($result))
 {
 echo"<tr><td>";$thisShit=utf8_decode($row[0]);echo"$thisShit</td></tr>";
}
echo
"</table>";

?>

Comunidad PHPeros

Graves Problemas UTF-8
« en: 05 de Octubre de 2011, 00:41:48 am »

Desconectado Mixvice

  • PHPero Experto
  • *****
  • Mensajes: 687
  • Karma: 32
  • Sexo: Masculino
  • ¡Y Tu Papá Tambien!
    • Ver Perfil
    • Tuhabbo
Re:Graves Problemas UTF-8
« Respuesta #1 en: 05 de Octubre de 2011, 01:26:30 am »
No se si sea la mejor forma pero yo use htmlspecialchars() y con esto se arreglo.. puedes intentarlo xD

Desconectado ryksz

  • PHPerit@
  • *
  • Mensajes: 3
  • Karma: 0
  • Nuev@ PHPer@
    • Ver Perfil
Re:Graves Problemas UTF-8
« Respuesta #2 en: 05 de Octubre de 2011, 01:54:22 am »
Pues me da los mismos resultados, quizá deba averiguar antes como usar propiamente la función :P
Gracias

Desconectado Mixvice

  • PHPero Experto
  • *****
  • Mensajes: 687
  • Karma: 32
  • Sexo: Masculino
  • ¡Y Tu Papá Tambien!
    • Ver Perfil
    • Tuhabbo
Re:Graves Problemas UTF-8
« Respuesta #3 en: 05 de Octubre de 2011, 04:05:51 am »
Disculpa me confundí, es con htmlentities() no con specialchars, intentalo de esta forma:

Código: [Seleccionar]
<?php
 
include(&#39;db.php&#39;);
 
 
 
$query="SELECT apellido FROM empleados WHERE nombre=&#39;$q&#39;";
 
$result=DBExecute($query,$link,1);
 echo
"
 <table>
 <tr>
 <th>Apellido</th>
 <tr>"
;
 while(
$row=mysql_fetch_row($result))
 {
 echo"<tr><td>";$thisShit=utf8_decode(htmlentities($row[0]));echo"$thisShit</td></tr>";
}
echo
"</table>";

?>

Desconectado ryksz

  • PHPerit@
  • *
  • Mensajes: 3
  • Karma: 0
  • Nuev@ PHPer@
    • Ver Perfil
Re:Graves Problemas UTF-8
« Respuesta #4 en: 06 de Octubre de 2011, 08:12:05 am »
Ah muchas gracias!! eso arregló mis problemas aunque solo en Chrome... ??? jaja
Explorer8, 9 y Firefox 7.0.1 aún me presentan mal los acentos y eso... Por lo pronto está solución me ayuda a seguir el desarrollo, pero, crees que el problema con los otros exploradores se deba a como creo el AJAX? Pues este código lo vengo usando desde el Explorer 7  :D habrá alguna mejor forma de hacerlo?

Código: [Seleccionar]
function crearAjax()
{
var xmlhttp = false;

if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
 
  return xmlhttp;
}

Antes de esto intenté establecer en la cabecera el charset=iso-8859-1, eso ayudó en alguna medida pero, solo presentando los resultados ya que al hacer querys en la base de datos si busco por nombre y hay un caracter como "ç" no encuentra nada pues busca otra cosa...

Gracias de nuevo 8)

Desconectado SoyJoaquin.

  • PHPero Master
  • ******
  • Mensajes: 2.737
  • Karma: 131
  • Sexo: Masculino
  • ส้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้ส้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้ Problem?
    • Ver Perfil
    • IsoMap
Re:Graves Problemas UTF-8
« Respuesta #5 en: 06 de Octubre de 2011, 14:14:20 pm »
El código no influye en nada cuando la codificación del archivo se encuentra mal.
Revisa que la codificación de tu archivo este en utf8.
Saludos.
Twitter: @JoakoM010



Desconectado nmartin021

  • PHPero Avanzado
  • ****
  • Mensajes: 250
  • Karma: 9
    • Ver Perfil
Re:Graves Problemas UTF-8
« Respuesta #6 en: 07 de Octubre de 2011, 07:25:59 am »
No, no. El error no está en cambiar htmlspecialchars() por htmlentities(), sino usar iso-8859-1, yo lo uso y me funciona sin problemas ( iso-8859-1 + htmlspecialchars() y me sale todo bien, uso chrome ).

Ahora, el problema a lo mejor está en Javascript, si usas la librería jQuery puedes usar esto para que funcione sin problemas:

Código: [Seleccionar]
//$.get para get, $.post para post
$.get('/ruta/hacia/mi/archivo.php', 'parametro=hola&id=2&ejemplo=3', function(respuesta){
    document.getElementById('resultado').innerHTML = respuesta;
});


Te lo explico:

# $.get || $.post -> métodos que AJAX soporta, GET y POST
# primer parámentro $.get / $.post: ruta del archivo a llamar
# segundo parámetro: datos que se pasan al archivo, como si fuera archivo.php?algo=algo&mas=1 ......
# tercer parámetro: función que se evaluará cuando llegue la respuesta
## nota: puse function(respuesta) <-- "respuesta" es la variable en la que se guardará el resultado, puedes cambiarla por cualquiera, es cuestión de comodidad ( es decir, puedes usar cualquier nombre para la variable, no tiene por qué ser "respuesta" )

-------

Y si no usas jQuery, prueba el método que te dije ( la página que recibe los datos ha de tener sí o sí el charset ).

Me he fijado de que pones '?q=' + nombre, si el valor de la variable tiene caracteres especiales, puedes usar encodeURIComponent() ( más info )

Saludos