Formulario contacto PHP, acentos y codificación

squ4r3

Holabuenasquetal,

tengo una pagina html con un formulario,

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> en el head

utilizo un archivo php para enviar los datos

codigo

antes de nada, os dire que no tengo ni idea de php, por si veis alguna burrada, ha sido todo copypaste

la cosa es que tengo un problema con la codificación, en cuanto entran en juego eñes y acentos, lo veo en plan "dÚ,.sáŽtánìì".

he estado mirando formas de arreglar esto pero la verdad es que no doy con la solución, llevo toda la tarde trasteando, y no consigo echarlo a andar. la verdad es que agradecería algo de ayuda. sentar alguna base aunque sea muy ligera de php lo tengo en mi lista de cosas pendientes, os prometo que si me ayudais con esto prometo que me pondre a ello seriamente! xD

un saludo y muchas gracias por adelantado.

NeB1

El problema de la codificación lo tienes al visualizar la web o en el mensaje enviado?

===========================================================
Si es el segundo caso, la solucion es intercambiar esta linea:

mail($destino, $subject, $cuerpo, "From: ".$email.""); 

por esta otra:

$cabeceras  = 'MIME-Version: 1.0' . "\r\n";
$cabeceras .= 'Content-type: text/html; charset=utf-8' . "\r\n";
$cabeceras .= 'From: ".$email."\r\n";

mail($destino, $subject, $cuerpo, $cabeceras); 

En caso de que sea el primer caso, una de las soluciones más fáciles es intercambiar los carácteres especiales por sus html entities:
á => &aacute; é => &eacute; &í => &iacute; ...
Á => &Aacute;...
ñ => &ntilde;
¿ => &iquest;

La otra forma, si con el header de html no te hace caso, probar con el header de php (seguramente no funcionará tampoco) y si no funciona, con cualquier editor de texto medianamente decente, tendrá una opción que será 'Convertir a: ' 'utf-8'.

También puedes configurar apache para que por defecto te coja el charset utf-8, pero bueno, esto ya es más 'complicado' (con comillas xD)

squ4r3

el problema es a la hora de visualizar el email, a mi me da un poco igual porque se que son acentos y eñes e interpreto el texto sin problemas, pero lo va a usar mas gente y queda muy cutre estar viendo el mensaje codificado raro.

voy a probar eso de los header que comentas y ahora te cuento, un saludo

edito: me tira

Warning: Unexpected character in input: ''' (ASCII=39) state=1 in /***.php on line 27

Parse error: syntax error, unexpected ':' in /***.php on line 27

linea 27: $cabeceras .= 'From: ".$email."\r\n";

me ha quedado todo así

spoiler
NeB1

xD se me ha escapado

sustituye
$cabeceras .= 'From: ".$email."\r\n";

por
$cabeceras .= 'From: '.$email."\r\n";

RaymaN

#4 y otra vez le va a petar xD

Cambia las dobles comillas por simples.

squ4r3

vale, ya decia yo que algo pasaba, el highlight del notepad++ me ha cambiado y me ha olido mal, voy a volver a probar, thx

edito: vale, tambien he cambiado por comillas simples, ahora se ve en plan HTML, es decir "&Atilde;&uml;" etc.

además, como utilizo algo llamado header mas arriba para redireccionar si todos los campos estan rellenados, me tira el siguiente error:

Warning: Cannot modify header information - headers already sent by (output started at /.php:1) in /.php on line 12

linea 12

pd: muchas gracias

NeB1

#5 está bien la línea, concateno un string con comillas simples, despues una variable, y después otra string con comillas sobles ( por copiar y pegar )

#6 Antes de usar cualquier funcion 'header' en PHP no se puede hacer ningún 'echo' ni ningún 'print' ni nada que imprima algo por pantalla, es decir:



MAL! , esto estaría bien sin embargo:

<?php
header("Location:index.php");
?><html>
<head>

Ten en cuenta, que un espacio en blanco también es un carácter., si antes del <?php hay un espacio en blanco te saltará el mismo error.

Lo mismo se aplica en session_start(); que es otra cabecera.

squ4r3

#7 hm...no entiendo eso ultimo, bueno, lo puedo llegar a entender, pero no veo como se aplica a mi caso. teniendo en cuenta que no se de php ni lo que es concretamente un header... pues está chungo explicarme cosas xDD.

tendre que ponerme con php desde ya

NeB1

#8 en resumen, que antes de tu

<?php

hay algo, aunque sea un salto de línea, o cualquier cosa, y no tiene que haber nada, y te está jodiendo los headers que usas más abajo en la linea

header("Location: http://www.***.html"; }else{header("Location: http://www.***.html";
squ4r3

vale, eso lo he solucionado, el problema es que ahora lo veo en plan

Mensaje: u&Atilde;&sup1;&Atilde;&sup1;&Atilde;&sup1;&Atilde;&sup1;u`&Acirc;&acute;a&Atilde;&iexcl;&Atilde;&iexcl;&Atilde;&iexcl;&Atilde;&iexcl;

:(

NeB1

Puedes enseñarme tu código??? no abrás usado la función 'htmlentities' en el cuerpo del mensaje, no?

squ4r3

por supuesto

código

el archivo php esta guardado con codificacion ANSI, segun el bloc de notas, puede ser por algo de eso?

muchas gracias por la ayuda, de verdad

NeB1

#12 en la función cad_limpia estás usando html_entities

(trim(html_entities)

Eso es lo que hace que al llegarte el e-mail te llegue como &eacute; &ntilde; etc. cambia esto:

function cad_limpia ($string) {
     return trim(htmlentities(strip_tags($string)));
}

por

function cad_limpia ($string) {
     return trim(strip_tags($string));
}

y me cuentas.

squ4r3

#13 muchas gracias, ya funciona, ahora para bordarlo, me faltaría que el campo de "email" sea el que sale como el que envía el mensaje, no se si me explico, antes me llegaba el mail como desde el propio usuario, y con darle a "responder" desde gmail, por ejemplo, ya le respondia.

ahora me llega como desde CGI-mailer, y claro, eso no mola.

supongo que es algo relacionado con la linea

mail($destino, $subject, $cuerpo, $cabeceras);

he intentado apañarlo yo de forma intuitiva poniendo mail($destino, $subject, $cuerpo, $cabeceras, "From: ".$email.""); pero entonces el mail nunca llega, ni me da error php de ningun tipo.

saludos y gracias de nuevo

edit: codigo final

spoiler

deduzco que una de las cabeceras es la que me pones de $cabeceras .= 'From:' .$email.'\r\n'; , pero aun asi no me sale el remitente del mensaje :(

NeB1

Pues sí, debería ser esa cabecera, cambiala por esta a ver...

$cabeceras = "from: Pepito Grillo <[email protected]>\n"; 

a ver si te funciona. En caso de que sea que sí, despues cambias los datos por datos reales, quería comprobar también si era por poner un from de un dominio que no es el auténtico remitente.

LR

A mi en hotmail eso me dio algunos problemillas, en cambio en gmail podia ponerle lo que me diese la gana que salia bien el remitente.

Voy a buscar por aqui a ver como lo solucione y te lo pongo.

NeB1

A la larga, todo se soluciona usando PHPMailer o similares XD

LR

la verdad es que si. PHPmailer es de las mejores cosas que he probado en el poco tiempo que llevo en esto. Y la verdad es que te evita muchos dolores de cabeza

Usuarios habituales

  • LR
  • NeB1
  • squ4r3
  • RaymaN