Ver Mensaje Individual
  #10 (permalink)  
Antiguo 05/03/2010, 13:10
Avatar de HackmanC
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 ...