Palabras Acentuadas problema al mostrar !

Iniciado por Diabliyo, 1 Noviembre 2014, 17:56 PM

0 Miembros y 1 Visitante están viendo este tema.

Diabliyo

Buen dia.

Tengo dos sitios web, en uno tengo mi sistema de almacen donde subo todos los productos.
Y el segundo sitio web es la pagina de Ventas, medante un API que desarrolle jalo la informacion del almacen (sitio web 1).

En el Sitio Web 1 (uno) no tengo problemas para guardar y editar la informacion de mis productos con acento, por ejemplo si el titulo del producto lleva acento, este se guarda sin problemas y cuando intento editar lo miro perfectamente.

En el Sitio Web 2 (dos) cuando jalo la informacion siempre me salen las palabras con acento mal impresas :(, por ejemplo la letra o acentuada, se me imprime asi: ó.

Ya verifique que mi apache tenga por defecto el UTF-8.
Ya puse en el HEADER de mi index (antes del tag <html>) el header: header ('Content-type: text/html; charset=utf-8');
En mi Sitio Web 1 (uno) tambien tengo UTF-8 tanto por encia del <html> como en el apache.

Que podrá ser ?

Saludos !

engel lex

la base de datos (no solo la tabla) está también en colacion utf8?
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

Diabliyo

Buen dia.

Buena pregunta... revise ya y las tabla ALMACEN del Sitio Web 1 (uno - sistema almacen): latin1_swedish_ci   

Pero bueno se me hace tambien ilogico no se muestre bien el texto ya que tanto en el Sitio Web 1 como en el Sitio Web 2 uso el mismo metodo de imprimir:

# el sitio web 2 (ventas)
echo html_entity_decode( $variable, ENT_QUOTES );

# en el sitio web 1 (almacen)
$query= 'insert into TABLE(valor) values( \'". htmlentities($var, ENT_QUOTES). "\');';

Ademas en el Sitio Web 1 (almacen) es donde guardo la informacion en la BD.
Y en el Sitio web 2 (ventas) no guardo info en la BD, solo consulto con el API al Almacen.

Por otro lado en el Sitio Web 1 (almacen), no tengo este problema :S !

Saludos !

Graphixx

#3
Prueba antes de insertar y antes de leer usar :
Código (php) [Seleccionar]
mysqli_set_charset($conexion,"utf8");

Por si no se entiende que es $conexion:
Código (php) [Seleccionar]

include_once("../mysqli.inc.php");
$conexion=mysqli_connect ($cfg_servidor,$cfg_usuario,$cfg_password,$cfg_basephp1);
Nada tiene fin solo hay pequeñas pausas, pausas que determinan el comienzo de otros. Graphixx
Mi blog

WHK

Ojo, primer punto: htmlentities no evita inyecciones sql, segundo: htmlentities es una funciòn diseñada para la salida de datos no la entrada, si despues si alguien necesita hacer una busqueda desde el terminal como lo hará? tendria que codificar de memoria en htmlentities y tu base de datos va a perder integridad y va a aumentar su tamaño, la función htmlentities se usa solo cuando lo vas a mostrar como en un echo no cuando lo guardas.

Diabliyo

#5
Cita de: Graphixx en  1 Noviembre 2014, 18:39 PM
Prueba antes de insertar y antes de leer usar :
Código (php) [Seleccionar]
mysqli_set_charset($conexion,"utf8");

Por si no se entiende que es $conexion:
Código (php) [Seleccionar]

include_once("../mysqli.inc.php");
$conexion=mysqli_connect ($cfg_servidor,$cfg_usuario,$cfg_password,$cfg_basephp1);


El problema creo yo no es donde inserto, sino en donde muestro.
Por que en el Sistema almacen (Sitio Web 1) no tengo problemas para mostrar caracteres acentuados, de hecho si EDITO mis productos puedo ver los acento perfecto, igual en la lista de productos.

El problema surge en la Pagina de ventas (Sitio Web 2) cuando consulto mediante el API y obtengo respuesta, imprimo el producto asi:

Código (php) [Seleccionar]
<?php
$q
miapi"productos""all");

foreach( 
$q as $key=>$val )
          echo 
html_entity_decode$val->tituloENT_QUOTES );
?>


Los titulos de los productos salen con caracteres raros, por ejemplo la letra o acentuada, sale impresa asi: ó

Repito... si voy al Sistema de Almacen (sitio web 1) yo veo las letras acentuadas bien, y si edito los productos sigo viendo todo bien.

En abos sitios web tengo my.cnf para que por dfault sea utf8, en el index.php invoco el header para tipo de contenido utf8, tambien el meta tag de contenido utf8 y en el httpd.conf como default utf8.

Saludos !






Cita de: WHK en  1 Noviembre 2014, 18:58 PM
Ojo, primer punto: htmlentities no evita inyecciones sql, segundo: htmlentities es una funciòn diseñada para la salida de datos no la entrada, si despues si alguien necesita hacer una busqueda desde el terminal como lo hará? tendria que codificar de memoria en htmlentities y tu base de datos va a perder integridad y va a aumentar su tamaño, la función htmlentities se usa solo cuando lo vas a mostrar como en un echo no cuando lo guardas.

Wow... me sorprende...

Si busco en google, todas partes recomiendan que al momento de insertar en una BDD pases las variables por htmlentites(), por consecuencia para mostrarlas debes pasar el decode.

Y para la busqueda, pues igual forma, pasarias la "muestra" de la busqueda a htmlentities, y despues la consulta en la BD.

En fin... creo yo no es mi problema....






Como maneja el flujo de datos mi API ?
Los clientes deben enviar la consulta en json encodeado (json_encode()).

El API (servidor) recibe el flujo json encodeado, lo decodifica (json_decode()), analiza la peticion y genera una respuesta en json encodeado (json_encode()) y lo envia al cliente.

En el cliente (el SDK) recibe la respuesta y la decodifica (json_decode()), esto resulta un OBJETO.

El objeto lo recorro e imprimo las partes que quiero.
Cada una de las partes (valores de las variables) fueron previamente pasadas por un htmlentities( $var, ENT_QUOTES) de lado del servidor.
Por consecuencia el cliente debe invertir esas variables pasandole un html_entity_decode() (dependiendo el caso).

Saludos !



MOD: NO HAGAS TRIPLE POST.
YO: sobres...

WHK

#6
CitarSi busco en google, todas partes recomiendan que al momento de insertar en una BDD pases las variables por htmlentites(), por consecuencia para mostrarlas debes pasar el decode.

El creador de PHP hizo esa función para ser utilizada en datos de salida, antiguamente todos ponian variables en las funciones include() y todos pensaban que estaba bien hasta que comenzaron a darse cuenta que existía algo llamado LFI y RFI, como también antiguamente la gente pensaba que un safe mode evitaba que te hackearan el website, si buscabas por internet podias encontrar todo tipo de profesionales y no profesionales diciendo lo mismo, hasta que el mismo creador de php tubo que decir oficialmente que un safe mode en on no prevenía ni mitigaba ni si quiera un poco un hackeo, es mas, por lo mismo decidió eliminar safe mode en las versiones nuevas de php.

En fin, una cosa es hacer lo que la mayoría de la gente irgnorante dice y otra muy distinta es seguir los estándares y guiarse por la documentación oficial del lenguaje o framework, etc.

Yo conozco alguien que alguna ves fue moderador de este foro y que ahora anda dando conferencias diciendo que es bueno guardar los textos ya codificados en htmlentities, gracias a ese tipo de conferencias cada día la gente sabe programar mas mal dejando en segundo plano el saber programar bien y seguro.

Dale un vistazo acá:
http://stackoverflow.com/questions/71328/what-are-the-best-practices-for-avoiding-xss-attacks-in-a-php-site#answer-71444

Tal como dice ese post, que pasa si despues necesitas procesar los datos vía json, via xml, etc? puedes producir problemas, en ves de eso se debe guardar tal cual es el valor y despues al desplegar o procsar usas el filtro adecuado el cual no siempre va a ser entidad html, puede ser por ejemplo escape de sql al guardar un dato de un lado a otro por ejemplo y el htmlentities no te va a salvar, es mas, puede corromper los datos de manera inesperada ya que htmlentities no filtra comillas simples a menos que le indiques lo contrario, no filtra signos de porcentaje, tampoco saltos de linea (ahi tienes un xss si lo procesas en javascript), el htmlentities tampoco te filtra el backslash, puedes inyectar secuencia de escapes en javascript y querys sql, y de que hablar de listas negras, esto no sirve y se ha hablado un montón en el foro,... etc.

Pero en fin, ese es otro tema.

JorgeEMX

Sobre el tema de acentos, revisa bien la codificación de tus archivos (en algún editor como Notepad++). Eso influye bastante y son cosas a considerar a parte de la codificación de la base de datos y de charset que ocupes en la definición de tu HTML. Eso si, para evitar problemas, estos 3 puntos deberán coincidir.

MinusFour

Parece un caso de doble encoding. Lo mas probable es que el navegador este interpretando otro encoding. ¿Por que?

Pusiste el ejemplo de ó

El equivalente en UTF-8 es: C3 B3 (Hex)

Tu navegador interpreta: ó

Fija como tu navegador se interpreta los bytes por separado, ahora si te vas a ver el encoding ISO-8859 o Windows-1252:

C3 = Ã
B3 = ³

http://en.wikipedia.org/wiki/Windows-1252#Code_page_layout

Ahora, el header que envias deberia asegurarte que el navegador se lea el documento en UTF-8 mas no que lo presente en UTF-8. ¿Que Doctype estas usando? Asegurate de establecer el charset correctamente:

Si estas usando html5:
Código (html) [Seleccionar]

<meta charset="utf-8">


R2100

Estos tipos de problemas se suelen solucionar:
a)Cambiando la codificación entre utf8 y latin1 ... Content-type: text/html; charset=xxx');
b)Como dice JorgeEMX, cambiando la codificación del fichero php con notepad o similar
c)Códificando y descodificando (utf8_encode y utf8_decode)