Foros del Web » Programando para Internet » PHP »

Problemas con acentos,ñ, tildes etc, letra por letra ...

Estas en el tema de Problemas con acentos,ñ, tildes etc, letra por letra ... en el foro de PHP en Foros del Web. Buen día foreros ... vengo a ustedes ya que tengo un problema que me trae loco, os explico ... eh creado un archivo.php con las ...
  #1 (permalink)  
Antiguo 16/07/2013, 11:38
 
Fecha de Ingreso: junio-2012
Ubicación: México
Mensajes: 3
Antigüedad: 11 años, 9 meses
Puntos: 0
Exclamación Problemas con acentos,ñ, tildes etc, letra por letra ...

Buen día foreros ... vengo a ustedes ya que tengo un problema que me trae loco, os explico ...

eh creado un archivo.php con las siguientes lineas de código:

<?php
header("Content-Type: text/html;charset=utf-8");
$prueba = "México";
?>

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title></title>
</head>
<body>
<?php
echo "Palabra normal: ".$prueba."<br/>";
echo "Letra normal: ".$prueba[2]."<br/>";
echo "Con utf8_encode: ".utf8_encode($prueba)."<br/>";
echo "Con utf8_decode: ".utf8_decode($prueba)."<br/>";
?>
</body>
</html>

muy sencillo no?, como pueden observar todo el documento esta creado con cotejamiento utf8, el problema ocurre cuando quiero tomar de la palabra "México" la letra "é" en teoría debería de mostrarme la letra "é" en la segunda impresión de mi documento, sin embargo me muestra un caracter raro.

La impresión sale así:

Palabra normal: México
Letra normal: �
Con utf8_encode: México
Con utf8_decode: M�xico

espero haberme explicado y que me puedan ayudar para saber como lograr que aparezca la letra "é" como debería de ser, otro dato importante es que si agrego cualquier otra letra con acento o ñ, pasa exactamente lo mismo y si utilizo el utf8-encode la letra me la pone con el mismo valor de "é" ...

Gracias desde ya .. saludos..
  #2 (permalink)  
Antiguo 16/07/2013, 13:14
Avatar de skiper0125  
Fecha de Ingreso: octubre-2010
Ubicación: $this->Mexico('Toluca');
Mensajes: 1.127
Antigüedad: 13 años, 6 meses
Puntos: 511
Respuesta: Problemas con acentos,ñ, tildes etc, letra por letra ...

Hola que tal.

Puedes utilizar esta función htmlentities( )

Código PHP:

$palabra 
'México';

echo 
htmlentities$palabra );

//  México 
Saludos
__________________
Recuerda que estamos aquí para orientarte, y no para hacer tu trabajo.
Si mi aporte fue de ayuda, recuerda que agradecer no cuesta nada +1

Skiper0125
  #3 (permalink)  
Antiguo 16/07/2013, 13:17
Avatar de pzin
Moderata 😈
 
Fecha de Ingreso: julio-2002
Ubicación: Islas Canarias
Mensajes: 10.488
Antigüedad: 21 años, 8 meses
Puntos: 2114
Respuesta: Problemas con acentos,ñ, tildes etc, letra por letra ...

Cita:
Iniciado por Dave_27 Ver Mensaje
como pueden observar todo el documento esta creado con cotejamiento utf8
En realidad no lo podemos observar. Tienes que guardar el archivo con esa codificación con tu editor de texto.
  #4 (permalink)  
Antiguo 16/07/2013, 14:59
 
Fecha de Ingreso: junio-2012
Ubicación: México
Mensajes: 3
Antigüedad: 11 años, 9 meses
Puntos: 0
Pregunta Respuesta: Problemas con acentos,ñ, tildes etc, letra por letra ...

Gracias por su respuesta ... skiper0125 el htmlentities no me funciono ya que la palabra México sale impresa de la misma manera que usando el utf8_encode .. además recuerda que yo solo necesito la letra con el acento ..

pzin .. guarde en el editor con el utf8 el mismo código y el problema sigue, subo una imagen para que se aprecie mejor ..

Como dato adicional: estoy haciendo un pequeño script para reemplazar acentos y ñ, sin embargo cada que lo reemplaza me lo cambia por una A ya que el script interpreta el acento de cualquier letra y ñ con este caracter "é" por ende lo reemplaza por una A ..

Saludos ..



Pongo el link directo, por si no se mira la imagen ... http://www.subirimagenes.com/otros-img-8540771.html
  #5 (permalink)  
Antiguo 16/07/2013, 16:10
Avatar de CesarHC  
Fecha de Ingreso: junio-2011
Ubicación: localhost
Mensajes: 566
Antigüedad: 12 años, 10 meses
Puntos: 56
Respuesta: Problemas con acentos,ñ, tildes etc, letra por letra ...

Haber prueba asi:

Código PHP:
Ver original
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset=UTF-8">
  5. <title></title>
  6. </head>
  7. <body>
  8. <?php
  9. $prueba = "México";
  10. echo "Palabra normal: ".$prueba."<br/>";
  11. echo "Letra normal: ".$prueba[1]."<br/>";
  12. echo "Con utf8_encode: ".utf8_encode($prueba)."<br/>";
  13. echo "Con utf8_decode: ".utf8_decode($prueba)."<br/>";
  14. ?>
  15. </body>
  16. </html>

En tu codigo esto esta de mas:

Código HTML:
Ver original
  1. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

Debes tenerlo asi:

Código HTML:
Ver original
  1. <meta charset=UTF-8">
__________________
Solo la práctica no te traicionara ¡¡¡¡¡¡

Seguir el camino tu debes PHP The Right Way.

Última edición por CesarHC; 16/07/2013 a las 16:29
  #6 (permalink)  
Antiguo 17/07/2013, 10:25
 
Fecha de Ingreso: junio-2012
Ubicación: México
Mensajes: 3
Antigüedad: 11 años, 9 meses
Puntos: 0
Pregunta Respuesta: Problemas con acentos,ñ, tildes etc, letra por letra ...

Cita:
Iniciado por CesarHC Ver Mensaje
Haber prueba asi:

Código PHP:
Ver original
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset=UTF-8">
  5. <title></title>
  6. </head>
  7. <body>
  8. <?php
  9. $prueba = "México";
  10. echo "Palabra normal: ".$prueba."<br/>";
  11. echo "Letra normal: ".$prueba[1]."<br/>";
  12. echo "Con utf8_encode: ".utf8_encode($prueba)."<br/>";
  13. echo "Con utf8_decode: ".utf8_decode($prueba)."<br/>";
  14. ?>
  15. </body>
  16. </html>

En tu codigo esto esta de mas:

Código HTML:
Ver original
  1. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

Debes tenerlo asi:

Código HTML:
Ver original
  1. <meta charset=UTF-8">

Gracias por la respuesta CesarHC... te comento mi experiencia ...

hice un copy paste de tu código y lo reemplace con el mio, en primera instancia me funciono perfecto para lo que requiero obtuve la "é" con el acento, sin embargo todo el texto directo html que escribo con acentos o ñ, me aparecen caracteres raros, pensé, tal ves se modifico el cotejamiento del archivo y cree de nuevo el archivo con el catejamiento utf8, guarde y al momento de refrescar mire y la impresión de los datos me salio como antes de meter tu código, otro dato importante que descubrí es que si almaceno en una variable solo la letra "é" y la imprimo me la imprime bien, pero si pongo el offset cero de esa variable ya me aparece el caracter raro ...

No se que hacer estoy apunto del colapso .. !!
  #7 (permalink)  
Antiguo 17/07/2013, 11:09
Avatar de CesarHC  
Fecha de Ingreso: junio-2011
Ubicación: localhost
Mensajes: 566
Antigüedad: 12 años, 10 meses
Puntos: 56
Respuesta: Problemas con acentos,ñ, tildes etc, letra por letra ...

Pues que raro ese codigo deberia funcionar correctamente,salvo que envies los datos a esta pagina desde otra con una codificacion diferente,prueba trabajar con el encode que devuelve correctamente los datos:
Código PHP:
Ver original
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title></title>
  6. </head>
  7. <body>
  8. <?php
  9. $prueba = "¡¢£¤¥¦§¨©ª«¬®¯áéíóúñÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÑñÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞß";
  10. echo "Palabra normal: ".$prueba."<br/>";
  11. echo "Letra normal: ".$prueba[1]."<br/>";
  12. echo "Con utf8_encode: ".utf8_encode($prueba)."<br/>";
  13. echo "Con utf8_decode: ".utf8_decode($prueba)."<br/>";
  14. ?>
  15. </body>
  16. </html>
__________________
Solo la práctica no te traicionara ¡¡¡¡¡¡

Seguir el camino tu debes PHP The Right Way.

Última edición por CesarHC; 17/07/2013 a las 11:20
  #8 (permalink)  
Antiguo 17/07/2013, 11:39
 
Fecha de Ingreso: julio-2010
Mensajes: 275
Antigüedad: 13 años, 9 meses
Puntos: 21
Respuesta: Problemas con acentos,ñ, tildes etc, letra por letra ...

Tienes tres opciones:

Primera:
Con tu editor de texto, guarda el archivo con codificación "UTF-8" o "ISO-8859-1".

Segunda:
Código PHP:
Ver original
  1. echo "Con utf8_encode: ".utf8_encode($prueba)."<br/>";
  2. echo "Con utf8_decode: ".utf8_decode($prueba)."<br/>";

Tercera:
Vas al navegador de tu preferencia, en mi caso uso Firefox:
Ver -> Codificación de Caracteres -> UTF-8 / ISO-8859-1
  #9 (permalink)  
Antiguo 17/07/2013, 19:24
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 2 meses
Puntos: 260
Sonrisa Respuesta: Problemas con acentos,ñ, tildes etc, letra por letra ...

Cita:
Iniciado por Dave_27 Ver Mensaje
.. espero haberme explicado y que me puedan ayudar para saber como lograr que aparezca la letra "é" como debería de ser, otro dato importante es que si agrego cualquier otra letra con acento o ñ, pasa exactamente lo mismo y si utilizo el utf8-encode la letra me la pone con el mismo valor de "é" ...
En tu caso te aconsejo que uses ISO-8859-1 o ANSI a la hora de guardar el archivo y en los headers del documento HTML. El motivo es simple, prueba a crear el siguiente documento con UTF-8 y pruebalo; seguidamente prueba a guardar el mismo documento en ISO-8859-1 y has la misma prueba.

Código PHP:
Ver original
  1. <?php
  2. $a = 'México';
  3. echo strlen($a);
  4. ?>
Si hiciste las pruebas correctamente, para ISO-8859-1 el resultado será 6, y para UTF-8 será 7. ¿Porqué la función strlen devuelve 7 cuando el documento está en UTF-8? Porque la letra é ocupa dos espacios (técnicamente usa dos bytes y las demás letras un solo byte en las dos codificaciones), adicionalmente que la base del lenguaje PHP no está diseñada para UTF-8.

Al momento que realizas $a[1] solamente estás pidiendo un solo byte y por consiguiente no va a funcionar como esperabas si el documento no está en ISO-8859-1, donde no hay letras de dos espacios o bytes.

Cita:
Iniciado por pzin Ver Mensaje
En realidad no lo podemos observar. Tienes que guardar el archivo con esa codificación con tu editor de texto.
Técnicamente si lo podemos observar pero tomaría tiempo estar probando los resultados que obtuvo, aunque claramente se observa que cuando realizo un utf_encode le devolvió dos bytes. Así a ojo de buen cubero podría decir que el documento está almacenado en ISO-8859-1 pero tiene el header UTF-8, en otras palabras incorrectamente, aunque puedo estar equivocado por que no hice las pruebas correspondientes.

Cita:
Iniciado por Dave_27 Ver Mensaje
... otro dato importante que descubrí es que si almaceno en una variable solo la letra "é" y la imprimo me la imprime bien, pero si pongo el offset cero de esa variable ya me aparece el caracter raro ...
Si no tienes experiencia con que es un byte, asegurate de usar ISO-8859-1 y olvidate de estar convirtiendo entre ISO-8859-1 y UTF-8. Adicionalmente muchos programas dicen que guardan los documentos en ISO cuando realmente no lo 'convierten', copiar y pegar es el ejemplo clásico de mezclar en un solo documento dos codificaciones diferentes.

Cita:
Iniciado por Sirrohan Ver Mensaje
...
Primera:
Con tu editor de texto, guarda el archivo con codificación "UTF-8" o "ISO-8859-1".

Segunda:
Código PHP:
Ver original
  1. echo "Con utf8_encode: ".utf8_encode($prueba)."<br/>";
  2. echo "Con utf8_decode: ".utf8_decode($prueba)."<br/>";
Para lo que quiere hacer solamente le vale ISO. La $prueba[1] en UTF-8 siempre va a devolver un byte y por lo tanto no lo va a mostrar bien sea como sea. A menos que use $prueba = utf8_decode($prueba); entronces en $prueba va a tener la codificación ANSI y allí si puede usar $prueba[1].

En resúmen cuando quieras hacer expresiones regulares, cambiar letras por otras o extraer letras de un String, usa ISO para no complicarte la existencia, a menos que seas un experto en codificaciones de caracteres y su interpretación de bytes.

Saludos,
  #10 (permalink)  
Antiguo 17/07/2013, 19:30
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: Problemas con acentos,ñ, tildes etc, letra por letra ...

Todo lo que ha dicho HackmanC es correcto, pero, realmente tienes dos opciones:

1- Usar codificación en iso-8859-1 y no tendrás problemas con strlen() ni recorriendo caracter por caracter
2- Usar codificación utf-8 (o cualquier otra multibyte) y las funciones adecuadas: http://www.php.net/manual/es/ref.mbstring.php

Entonces, para saber la longitud de una cadena en utf-8 debes usar mb_strlen() y para recorrer caracter por caracter tendrías que hacer algo como:

Código PHP:
Ver original
  1. $str = "México";
  2. $len = mb_strlen($str,'UTF-8');
  3.  
  4. for($i=0;$i<$len;++$i) {
  5.     echo mb_substr($str, $i, 1, 'UTF-8')."<br/>";
  6. }
__________________
- León, Guanajuato
- GV-Foto

Etiquetas: acentos, letras, tildes
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 05:50.