Problema con charset PHP e Informix - Campos en blanco en G3W

Hola:

Recientemente migramos a la version 2.7 de Guaraní. También actualizamos a la versión 2.7 el portal web Guaraní 3W (El código fuente PHP)

El error que se nos presenta es que cuando algún alumno entra y quiere actualizar sus datos censales en las listas desplegables las cadenas de texto que tienen acento no se muestran (Por ejemplo se visualiza la respuesta “NO” pero no se ve la opción “SÍ” solo el campo en blanco, en el adjunto se ve mejor)

Nuestra instalación de G3W:
Debian 7.0 Wheezy
PHP 5.4.4
ODBC 2.2.14p2-5
Informix client: 4.10.UC1DE
DB: Informix 9.21 sobre Windows Server 2003

Al parecer el problema se da entre Informix y ODBC por diferencias en los charsets del cliente y de la base de datos. Mirando la base de datos con “select * from sysmaster:sysdbslocale” resulta que la base de datos del Guaraní está en “en_US.1252”

El odbc.ini tiene etos valores de charset para cliente y DB:

DB_LOCALE=en_us.1252
CLIENT_LOCALE=en_us.8859-1

Las mismas variables están seteadas para Apache.

¿Alguien podría orientarnos dónde puede estar el problema?
El problema ocurrió al actualizar a 2.7. Lo extraño es que los campos desaparecen por completo, la opción está pero es una cadena vacía.

Cualquier información es más que bienvenida.


captura-charset.jpg

captura-charset.png

Hola

Eso no es un problema que implique al informix.
Es entre las paginas de php y los templates.

Emilio

Hola Emilio:

Gracias por tu respuesta. Podrías ser más específico con el tema de los templates, porque nosotros no tocamos nada de los templates. Solamente descomprimimos el paquete del Guarani 3W y modificamos paramatros.inc. Nada más por eso me extraña que nos ocurra este problema.

Gracias y saludos

Si.
el punto es de encoding pero de los archivos.
vos tenes guardado en el disco de tu máquina una archivo que contiene una “á”. Lo que realmente tenes es un ascii(160) que el sistema lo interpreta de acuerdo al encoding que haya. El sistema operativo puede tener uno distinto. El php otro.

El consejo es modificar esos acentos que van a html por los códigos html, en este ejemplo á por á

Con ello no tendras problema con ningun juego de caracteres.

Emilio

Hola Emilio:

Sí, era un problema de codificación pero no de los templates. Las opciones que salen en las listas desplegables aparecen en el archivo www/a_alumnos/formularioDatosCensales.php, allí estaban las opciones con acento y las cambié a códigos de HTML.

Lo mismo no entiendo por qué no se veía en absoluto la cadena, cuando el problema era con un solo caracter. Generalmente cuando hay problemas de codificación se muestra el caracter acentuado con un código extraño. En este caso el código HTML producido contenía dentro del un pero con una cadena vacía. Así que problema de codificación de HTML no es.

Sigo pensando que el problema debe ocurrir en alguna parte del proceso de creación de los templates de Smarty. Alguna función debe estar “saneando” los strings que no le gustan y suprime por completo la cadena de texto.

Alguien en la sala que pueda dar una pista al respecto?

Desde ya gracias

Hola

vos tenes un problema con el PHP 5.4.4.
la funcion htmlspecialchars cambia el encoding por defecto que tenía.
el guarani esta hecho para iso-8859-1 que es lo que tenía antes la funcion php.
en php5.4 se cambia a utf-8 con lo cual deberás modificar todas las apariciones de htmlspecialchars agregándole el encoding (que es el tercer argumento).

Emilio

Ok,

Sí, es cierto, desde la versión 5.4.0 la versión por defecto del encoding que produce la función htmlspecialchars es UTF-8, lo que es raro es que la cadena que se produce está vacía, incluso cuando se muestra el código fuente la cadena de texto sencillamente no existe. No se trata de que se produce un string en UTF-8 y luego en el header de la página se declara el encodign como ISO-8859-1 y por lo tanto el browser lo parsea mal.

El "vaciamiento " de las cadenas con caracteres no ingleses debe estar en otra parte. Por otro lado si el encoding es importante, debería haber una parámetro a nivel de Guaraní para especificar qué encoding se va a usar. No me parece muy correcto que digamos tener que “hardcodear” el encoding.

Saludos y gracias por tu respuesta Emilio

Hola Federico

Lamento decirte que no tenés mas solución, por ahora que modificar los llamados a esa función.

Probá lo siguiente



$a = 'está';
echo '<p>empieza</p>';
echo htmlspecialchars($a);
echo '<p>en el medio</p>';
echo htmlspecialchars(utf8_encode($a));
echo '<p>termina</p>';

en un archivo php.

Emilio

Esta es la salida:

empieza
está

en el medio
está

termina

Si le fuerzo el charset al navegador a UTF8, se ve así:

empieza
está

en el medio
está

termina

Lo que no veo es que la función htmlspecialchars borre el contenido del string

va la mia…

el editor que usastes guarda en utf-8?


encoding.JPG

encoding.JPG_thumb.png

sitio php

Si el string de entrada contiene una secuencia de unidad de código no válida en el parámetro encoding dado, se devolverá un string vacío, a menos que cualquiera de las banderas ENT_IGNORE o ENT_SUBSTITUTE estén establecidas.
$ file charset.php charset.php: PHP script, UTF-8 Unicode text

Se guardó en UTF-8 el script de prueba charset.php con el código que me pasaste.

Lo mismo el script no genera los headers HTML donde se especifica el encoding que tiene que interpretar el navegador. Por eso creo que cuando lo fuerzo a UTF8 desde las opciones del navegador la primera aparición de la cadena “está” se ve bien, con sus acentos y todo y la segunda no sé por qué no se ve bien. Sospecho que vuelve a codificar UTF-8 en UTF-8 y por eso se ve mal, no sé, son solo conjeturas.

Lo mismo la cita que me pasas de la página de PHP lo aclara bien, sobre el tema de las cadenas vacías que es lo que está pasando.
De cualquier forma creo que la gente e Guaraní debería tener en cuenta este detalle y hacer la instalación independiente del charset. Se podría verificar de forma dinámica la versión de php de la instalación y setear la variable del charset de acuerdo a dicha verificación.

De nuevo gracias Emilio por tu ayuda