Foros del Web » Programando para Internet » PHP »

problema codificacion

Estas en el tema de problema codificacion en el foro de PHP en Foros del Web. Hola Chic@s!! Toy con un problema curioso y en el trabajo m estan metiendo caña asi k mas me vale arregarlo, a ver si me ...
  #1 (permalink)  
Antiguo 04/03/2010, 11:53
 
Fecha de Ingreso: octubre-2009
Mensajes: 154
Antigüedad: 14 años, 6 meses
Puntos: 0
problema codificacion

Hola Chic@s!!
Toy con un problema curioso y en el trabajo m estan metiendo caña asi k mas me vale arregarlo, a ver si me podeis ayudar..

La cosa es que tengo una aplicacion que tiene que funcionar tanto en windows como en linux, yo trabajo con linux,que puede guardar cuestionarios que tu importas excel o txt, pero cuando son txt necesito pasarlos de UTF-16 a UTF-8.
Hasta ahi no hay nada raro.
La aplicacion funciona bien pero cuando uso el caso del .txt y llamo a la funcion que ahora os pongo, al importar un test me sale todo correcto pero entre cada letra me sale un rombo negro con el simbolo de interrogacion dentro, es decir, letra correcta, simbolo,letra correcta, simbolo...asi hasta el final del codumento.
He probado varias cosas y nada me funciona..
Esta es la funcion:

<?php

function convert_file($filename)
{
$fh = fopen($filename, 'r') or die("Cannot open file: ".$filename);

if(filesize($filename) <= 0)
{
fclose($fh);
return;
}
$cons = fread($fh, filesize($filename));
fclose($fh);

if(substr($filename, strlen($filename) - 4) === ".txt")
{
$cons = mb_convert_encoding($cons, "ISO-8859-1", "UTF-16LE");
//$cons = iconv("UTF-8","UTF-16LE", $cons);
//$cons = str_replace( "?", "", $cons);


}
else
{
$cons = mb_convert_encoding($cons, "UTF-8", "UTF-8");
}
$filename = str_replace(".txt", ".csv", $filename);
$fw = fopen($filename, 'w') or die("Cannot open file: ".$filename);
for($i = 0; $i < strlen($cons); $i++)
{
if(ord($cons[$i]) == 9)
fwrite($fw, ';');
else if(ord($cons[$i]) == 34) {}
else
fwrite($fw, $cons[$i]);
}
fclose($fw);
}
?>

desde un scpript php llamo a esta funcion pasandole el archivo..
necesito alguna idea porfavor
muchas gracias!!

  #2 (permalink)  
Antiguo 04/03/2010, 12:06
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 15 años, 8 meses
Puntos: 1532
Respuesta: problema codificacion

prueba con las librerías de iconv o multibyte, para ser especifico: mb_convert_encoding
  #3 (permalink)  
Antiguo 04/03/2010, 12:11
 
Fecha de Ingreso: octubre-2009
Mensajes: 154
Antigüedad: 14 años, 6 meses
Puntos: 0
Respuesta: problema codificacion

ya xo ya ves que he utilizado mb_convert_encoding y no hace nada, tambien probé con iconv y nada tampoco, a que te refieres con que pruebe con las librerías?
  #4 (permalink)  
Antiguo 04/03/2010, 12:29
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 15 años, 8 meses
Puntos: 1532
Respuesta: problema codificacion

me refiero a que esas librerías tienen diversas funciones para codificar, búscalas en el manual de php, quizás alguna te sirva
  #5 (permalink)  
Antiguo 04/03/2010, 12:37
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: problema codificacion

Hola,

Cita:
Iniciado por edugilc Ver Mensaje
$cons = mb_convert_encoding($cons, "ISO-8859-1", "UTF-16LE");
Con esta sentencia estas convirtiendo de UTF-16LE a ISO-8859-1 de combinación de 4 bytes a 1 byte.

Cita:
Iniciado por edugilc Ver Mensaje
$cons = mb_convert_encoding($cons, "UTF-8", "UTF-8");
¿De UTF-8 a UTF-8? combinación de 2 bytes.


Ahora bien, lo mas probable es que depende de cómo (con que programa estas viendo el resultado). No puedes ver el resultado sin un programa que entienda bien la diferencia entre UTF-8 y UTF-16.

Muchos programas, sino la mayoría, no tienen la capacidad de hacer esa diferencia al vuelo; y te muestran el resultado con otra codificación con los respectivos símbolos ?. Prueba a abrirlos con el programa Notepad++, y en la parte inferior de la derecha, (en la barra de estado), te debe aparecer la codificación UTF-8, 16, ANSI; etc.

Si al abrirlos con Notepad++ te aparece la codificación correcta pero te sigue mostrando los símbolos ? entonces la conversión no la estas haciendo correctamente, los archivos originales no están en la codificación que estas poniendo.

Saludos,

ps: En este preciso momento no puedo ser mas específico, pero si no has resulto tu duda, posiblemente mas tarde, pueda explicarlo con mas detalle.
  #6 (permalink)  
Antiguo 04/03/2010, 13:03
 
Fecha de Ingreso: octubre-2009
Mensajes: 154
Antigüedad: 14 años, 6 meses
Puntos: 0
gracias chicos!!
si lo del iso-8859-1 esta mal, es k de probar tantas cosas ya no sabes que hacer y se me ha olvidado ponerlo bien.hasta mañana no lo puedo probrar porque ya no estoy en el trabajo pero os voy contando a ver..

nada, despues de leerme 1000 paginas diferentes, entrar en 40 foros esto sigue igual, he probado varias cosas pero es que mirad lo que me sale:

I�F�C�A�.�U�1�.�E�1�;�E�l�e�m�e�n�t�:� �I�n�t�e�g�r�i�t�y� �a�n�d� �E�t�h�i�c�a�l� �V�a�l�u�e�s�;�;�;� � �;�;�;�;� � �;�;�;�;� � �I�F�C�A�.�U�1�.�E�1�.�P�C�0�;�;�S�h�e�/�h�e� �k�n�o�w�s� �t�h�e� ........

he puesto en el tpl y php respectivamente esto:

<form action="{SCRIPT}" method="post" enctype="multipart/form-data" accept-charset="utf-8">

<meta name="Function insert csv test" content="text/html;" http-equiv="content-type" charset="utf-8">

y ya se me acabn las ideas, necesito ayuda por favorrrrr

recuero que estoy en linux con firefox

Última edición por GatorV; 05/03/2010 a las 10:02
  #7 (permalink)  
Antiguo 05/03/2010, 05:10
Avatar de MaBoRaK  
Fecha de Ingreso: abril-2003
Ubicación: La Paz - Bolivia
Mensajes: 2.003
Antigüedad: 21 años
Puntos: 35
Respuesta: problema codificacion

loading.............

Porque no dectectas primero la codification del texto con mb_detect_encoding ( http://php.net/manual/en/function.mb...t-encoding.php ) y luego lo pasas a UTF-8, talvez ni estes recibiendo el texto en UTF-16.

saludos


connection closed.
__________________

Maborak Technologies
  #8 (permalink)  
Antiguo 05/03/2010, 05:45
 
Fecha de Ingreso: octubre-2009
Mensajes: 154
Antigüedad: 14 años, 6 meses
Puntos: 0
pos me sale k esta en ASCII usando el detect..

me pone que es ASCII pero mi compannero me ha mandado otro y me jura y perjura que es UTF-16...creo que me voy a volver loco en serio..

a ver haciendo esto en el shell de linux :

iconv -f UTF-8 -t UTF-16 nombre_archivo_utf-16 > nombre_archivo_utf-8

me pasa de UTF-16 a UTF 8

pero si hago esto :

iconv("UTF-8", "UTF-16", "$cons"); no me lo hace y se supone que s lo mismo no? yo me estoy empezando a desesperar.

He cambiado el charset en el php.ini y nada y he mirado en etc/apache2/iconv y ahi esta el utf-8, m empiezo a hundir en el mar de la codificacion....


Última edición por GatorV; 05/03/2010 a las 10:01
  #9 (permalink)  
Antiguo 05/03/2010, 13:01
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: problema codificacion

Hola,

Cita:
Iniciado por edugilc Ver Mensaje
... esto sigue igual, he probado varias cosas pero es que mirad lo que me sale: ...
¿Sale en donde? Por favor no me digas que estas haciendo un 'cat archivo.txt' en la consola de Linux, para verificar que contiene el archivo o estas mostrandolo en una página HTML con <meta content="text/html;" http-equiv="content-type" charset="utf-8">.

Cita:
Iniciado por MaBoRaK Ver Mensaje
... Porque no dectectas primero la codification del texto con mb_detect_encoding ...
Y además mb_detect_order() para detectar el endianess.

Cita:
Iniciado por edugilc Ver Mensaje
pos me sale k esta en ASCII usando el detect..
me pone que es ASCII pero mi compannero me ha mandado otro y me jura y perjura que es UTF-16...creo que me voy a volver loco en serio..
Evidentemente ese archivo está en UTF-16, por lo que mostraste.

Cita:
Iniciado por edugilc Ver Mensaje
... He cambiado el charset en el php.ini y nada y he mirado en etc/apache2/iconv y ahi esta el utf-8, m empiezo a hundir en el mar de la codificacion....
Comenzar a cambiar parámetros al azar no va a ayudar mucho. La función mb_convert_encoding() es específica, cambia de una tabla a otra, no usa ningún parámetro en PHP.INI, cuando se especifican los 2 encoding.

Continua ...
  #10 (permalink)  
Antiguo 05/03/2010, 13:10
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: problema codificacion

....

Ahora bien ... la conversión es simple, si sabes exactamente la codificación del texto original. Te voy a poner varios ejemplos, porque no tengo el archivo original que estas usando y no puedo saber si exactamente está en la codificación que mencionas.

Yo hice tres archivos, uno en ANSI, otro en UTF-8 sin BOM, y otro en UTF-16 (UCS-2 Little Endian en su defecto) pero ... ¿Como sé realmente y ciertamente que estan en esa codificación?

Primero usé un programa que me permite convertir y que funcione bien como Notepad++. Seguidamente copie el mismo texto en los 3 archivos y los volví a guardar. El texto que usé de prueba fué:

TEXTO
ÁÉÍÓÚÑáéíóúñ

Al mostrar la lista de archivos con 'dir', cada archivo tiene un tamaño diferente aunque tienen exactamente las mismas 'letras'.

Código:
05/03/2010  12:09 p.m.                19 ascii.txt
05/03/2010  12:10 p.m.                40 utf16.txt
05/03/2010  12:09 p.m.                31 utf8.txt
  • ASCII tiene 19 bytes, porque cada letra ocupa 1 byte y hay 19 letras (2 son los retornos de carro \r\n).
  • UTF-8 tiene 31 bytes, porque cada letra ocupa 2 bytes; menos la palabra TEXTO que ocupa 1 byte por letra, porque están en el rango de los primeros 127 caracteres de la tabla ASCII, (mas los 2 bytes \r\n).
  • UTF-16 tiene 40 bytes, porque cada letra ocupa 2 bytes inclusive la palabra TEXTO y los 4 de retorno de carro y nueva línea y 2 bytes extra ¿firma BOM, algo del UCS2?.

Ahora ... convirtiendo ...

Código PHP:
<?php

$filename 
'utf16.txt';
$fh fopen($filename'r');
$cons fread($fhfilesize($filename));
fclose($fh);

$cons mb_convert_encoding($cons"ISO-8859-1""UTF-16LE");

$filename 'salida.txt';
$fh fopen($filename'w');
fwrite($fh$cons);
fclose($fh);

?>
La salida que se obtiene es esta:

Código:
05/03/2010  12:09 p.m.                19 ascii.txt
05/03/2010  12:33 p.m.                20 salida.txt
05/03/2010  12:10 p.m.                40 utf16.txt
05/03/2010  12:09 p.m.                31 utf8.txt
Y en salida.txt tengo 20 bytes, 1 byte de mas ¿?.
Si los comparo en binario obtengo, todos los bytes se corrieron 1 porque la conversión metió un byte más.
Código:
Comparando archivos ascii.txt y SALIDA.TXT
00000000: 54 3F
00000001: 45 54
00000002: 58 45
00000003: 54 58
00000004: 4F 54
00000005: 0D 4F
00000006: 0A 0D
00000007: C1 0A
00000008: C9 C1
00000009: CD C9
0000000A: D3 CD
0000000B: DA D3
0000000C: D1 DA
0000000D: E1 D1
0000000E: E9 E1
0000000F: ED E9
00000010: F3 ED
00000011: FA F3
00000012: F1 FA
FC: SALIDA.TXT es mayor que ascii.txt
Y en texto:
Se miran caracteres ráros porque lo copié de la consola, para que se pueda observar claramente el ejemplo.
Código:
Comparando archivos ascii.txt y SALIDA.TXT
***** ascii.txt
TEXTO
┴╔═Ë┌ÐßÚݾ·±
***** SALIDA.TXT
?TEXTO
┴╔═Ë┌ÐßÚݾ·±
*****
Por lo tanto los archivos son iguales, la conversión se realizó con éxito.
(NO se realizo perfectamente porque no estoy usando UTF-16 sino UCS-2 y me sobró 1 byte al inicio)

Continua ...
  #11 (permalink)  
Antiguo 05/03/2010, 13:13
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: problema codificacion

...

Todavía lo estoy probando en Linux, pero estoy casi seguro que el resultado va a ser el mismo. Lo que no estoy seguro es ... ¿Qué estas haciendo, cómo y porqué?

Posiblemente si expones claramente todos los detalles sea mas fácil darte un procedimiento exacto para que hagas la conversión, sino .. solamente se te puede explicar cómo se hace .. y al final tienes que hacerlo por tu cuenta.

Saludos,

Etiquetas: codificacion
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 19:51.