PDA

Ver la versión completa : Problemas con codificaciones en PHP



Bizkaitarra
27/01/2011, 10:24
Buenas,

Tengo un nuevo proyectillo al cual hay que hacer varias modificaciones.

Mi sorpresa ha sido al montarlo y descubrir que cada fichero está codificado con UTF-8 sin Boom (bien) o ANSI (noooooo).

Aparte de PHP tiene unos ficheros en la carpeta locale que usa la biblioteca para idiomas .po, los cuales están codificados en UTF-8 sin Boom.

Me gustaría probar a unificar todo en UTF-8 sin Boom para evitarme problemas y se que hay comandos en GNU-Linux para hacer algo así. Esas conversiones las quiero hacer por supuesto sin tener que reescribir las tildes y demás historias...

¿Alguien sabe como va el tema de convertir automaticamente mediante comando? ¿Alguna recomendación?

La cuestión ademas es que en real las codificaciones se ven bien, pero en desarrollo no consigo forzar que cargue como ISO y evidentemente se ve mal..

< - >
Bueno, he encontrado un programa que lo hace :)

http://php.net/manual/en/function.utf8-encode.php
(Buscad Julio Cesar 20-Jan-2009 01:08 (http://www.php.net/manual/en/function.utf8-encode.php#88329))

Ahora tendría que hacer lo mismo con la BBDD que está en latin1 sueco!!!!!!! (Salvo una tabla que está en UTF-8....)

juanvvc
27/01/2011, 10:36
Aunque ya lo hayas solucionado, por completitud el programa de línea de comandos que se usa para cambiar la codificación es "recode" ó "iconv".

Yo tengo un script "i2u" con iconv que crea la típica copia de seguridad y luego realiza la conversión. Simplificado:



mv "$1" "$1~"
iconv --from-code=ISO8859-1 --to-code=UTF-8 "$1~" -o "$1"


También tengo el correspondiente u2i :) Lo mismo se puede hacer con recode.

Por cierto, ¿qué es Boom? ¿Lo que sucede cuando metes una room en una Caanon?

Bizkaitarra
27/01/2011, 11:22
Aunque ya lo hayas solucionado, por completitud el programa de línea de comandos que se usa para cambiar la codificación es "recode" ó "iconv".

Yo tengo un script "i2u" con iconv que crea la típica copia de seguridad y luego realiza la conversión. Simplificado:



mv "$1" "$1~"
iconv --from-code=ISO8859-1 --to-code=UTF-8 "$1~" -o "$1"
También tengo el correspondiente u2i :) Lo mismo se puede hacer con recode.

Por cierto, ¿qué es Boom? ¿Lo que sucede cuando metes una room en una Caanon?

Es con una o, lo que puesto mal ;)
En Notepad++ diferencia entre Bom y sin Bom. Creo que es una serie de info sobre el fichero que está oculta pero que te fastidia si quieres poner headers con php por que cuenta como caracter...
http://es.wikipedia.org/wiki/Marca_de_orden_de_bytes_%28BOM%29

< - >
Y por cierto, sigo con el problema de Mysql :(

< - >
Parece que con:


ALTER TABLE `mitabla` DEFAULT CHARACTER SET utf8 COLLATE utf8_spanish_ci;

Se soluciona :)

Estopero
27/01/2011, 12:21
Si quieres tener la aplicación en utf-8 sin tener problemas yo lo que hago es:

En la clase donde hago la conexión a base de datos añado justo después de la conexión:
mysql_query("SET NAMES 'utf8'");

El header global mediante php:
header('Content-Type: text/html; charset=UTF-8');

Y un meta en el <head> del html así:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

Y las tablas de mysql que estén en utf-8 también claro! :)

Así he conseguido que en todos los tipos de configuración de servidor que he probado se fuerce la codificación a utf-8. A veces el servidor tiene una configuración por defecto, el apache otra, y mysql otra, así te evitas también problemas al migrar :)

Sobre convertir de forma automática ficheros ya habéis contestado ^^

Bizkaitarra
27/01/2011, 15:46
A tus apuntes añado que hay que poner también el enconding que quieres usar para el fichero de idiomas usando lo de gettext:



// Set language to Spanish
//setlocale(LC_ALL, 'es_ES'); // es_ES not in the server
setlocale(LC_MESSAGES, 'es_ES.utf8');
// run ok with LC_MESSAGES

// Specify location of translation tables
bindtextdomain("myAppPhp", "includes/locale");
bind_textdomain_codeset("myAppPhp", 'UTF-8');
A proposito de lo de la librería de gettext... me pasan cosas extrañas como el que no me obtenga correctamente los literales que voy cambiando, que no se muestran los cambios :(


Bueno, sigo aportando info :)

Parece que Gettext se cachea y no recoge nuevos cambios hasta reiniar Apache. No obstante, hay opción de evitar esto y en ello estoy, probandolo :)

Bueno, parece que funciona. Por lo menos me ha echo parte de las cosas...

La solución (http://blog.ghost3k.net/articles/php/11/gettext-caching-in-php)http://blog.ghost3k.net/articles/php/11/gettext-caching-in-php