Foros del Web » Programando para Internet » PHP »

[Aporte] Pseudo-conversión por lotes de ISO a UTF

Estas en el tema de [Aporte] Pseudo-conversión por lotes de ISO a UTF en el foro de PHP en Foros del Web. Supongo que a todos nos ha pasado que tenemos un sitio con codificación de caracteres en ISO y, por X razón, tenemos que convertir todo ...
  #1 (permalink)  
Antiguo 14/07/2009, 00:59
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
[Aporte] Pseudo-conversión por lotes de ISO a UTF

Supongo que a todos nos ha pasado que tenemos un sitio con codificación de caracteres en ISO y, por X razón, tenemos que convertir todo a UTF. Una opción es subir los archivos en modo binario en vez de texto, pero los acentos, tildes y otros caracteres especiales no serán convertidos. Por eso cree el siguiente script.

Crea el directorio destino, copia el siguiente código y guárdalo en un archivo __iso2utf.php (dentro de ese directorio), modifica $in_dir y $out_dir para apuntar a las carpetas de origen y destino, respectivamente; después abre en tu navegador el script desde localhost, ejemplo: http://localhost/sitio.utf/__iso2utf.php

Código php:
Ver original
  1. <?php
  2. $in_dir = '/wamp/www/sitio';
  3. $out_dir = '/wamp/www/sitio.utf';
  4. $extensions = array(
  5.     'php',
  6.     'txt',
  7.     'js',
  8.     'css',
  9.     'tpl',
  10.     'htm',
  11.     'html'
  12. );
  13. $cdirs = $cfiles = 0;
  14.  
  15. function getDir($input, $output) {
  16.     global $extensions, $cdirs, $cfiles;
  17.  
  18.     echo 'Cargando directorio: ' . $input . '<br />';
  19.     if(! $cdir = opendir($input))
  20.         die('Error abriendo el directorio.');
  21.     while(($file = readdir($cdir)) !== false) {
  22.         if($file == '.' || $file == '..')
  23.             continue;
  24.         $ifile = "$input/$file";
  25.         $ofile = "$output/$file";
  26.         if(is_dir($ifile)) {
  27.             // Es directorio, primero vemos que exista en el destino
  28.             if(! is_dir($ofile)) {
  29.                 // Si estás en linux agrega permisos de escritura: mkdir($ofile, 0777)
  30.                 if(! mkdir($ofile))
  31.                     die('No se pudo crear el directorio en la ruta de destino.');
  32.             }
  33.             // Procesamos el directorio y continuamos el ciclo
  34.             $cdirs++;
  35.             getDir($ifile, $ofile);
  36.             continue;
  37.         }
  38.         $ext = end(explode('.', $file));
  39.         if(! in_array($ext, $extensions))
  40.             continue;
  41.         echo '---- Procesando el archivo: ' . $file . '<br />';
  42.         // Leemos el archivo actual
  43.         $file_cnt = file_get_contents($ifile);
  44.         // Creamos el nuevo archivo en binario
  45.         if(! $file_utf = fopen($ofile, 'wb'))
  46.             die('No se pudo crear el archivo de destino');
  47.         // Grabamos el archivo, convirtiendo el contenido en UTF-8
  48.         fwrite($file_utf, utf8_encode($file_cnt));
  49.         fclose($file_utf);
  50.         $cfiles++;
  51.     }
  52. }
  53.  
  54. ?>
  55. <html>
  56. <head>
  57. <meta http-equiv="content-type" content="text/html; charset=utf-8" />
  58. </head>
  59. <body>
  60. <?php
  61. getDir($in_dir, $out_dir);
  62. echo '<p>Proceso finalizado con éxito:<br />';
  63. echo "<b>$cdirs</b> directorios y <b>$cfiles</b> archivos procesados.</p>";
  64. ?>
  65. </body>
  66. </html>

Lo que hace el script es recorrer todas las carpetas del sitio, analizar la extensión de los archivos y crear copias en binario de cada una de ellas en la carpeta de destino que corresponda.

Recuerda que esta es una solución temporal. Si Subes alguno de estos archivos por FTP debes hacerlo en modo binario o "la magia" podría no funcionar. Cada que vuelvas a editar alguno de estos archivos debes guardarlos con la codificación adecuada:

En Notepad (de windows) Menú -> Archivo -> Guardar como... y en la ventana de diálogo seleccionas Codificación: UTF-8 y haces click en aceptar cuando te pregunte si deseas sobreescribir.

En Notepad++ Menú -> Formato -> Codificar en UTF-8 y después grabas el archivo con CTRL + S o Menú -> Archivo -> Guardar

Nota: En ambiente LINUX deberás cambiar la parte de mkdir para asignar permisos de escritura al crear directorios y, tal vez, necesitarás modificar el modo de creación de archivos en fopen de 'wb' a 'w', teniendo en cuenta que la creación de archivos de texto es por default codificación UTF-8.
__________________
- León, Guanajuato
- GV-Foto
  #2 (permalink)  
Antiguo 14/07/2009, 09:15
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: [Aporte] Pseudo-conversión por lotes de ISO a UTF

hola...

me imagino que sería útil que comprobaras si realmente NO es utf-8 la codificación del archivo... ¿te parece??

ya que si de casualidad ya es utf-8 y al usar utf8_encode() pasas a estropear la codificación original del archivo, y así ya no sirve... al menos no como debería!!


revisa este enlace... y dime que te parece is_utf8()
http://us3.php.net/manual/en/functio...t-encoding.php
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 14/07/2009, 09:36
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 10 meses
Puntos: 1517
Respuesta: [Aporte] Pseudo-conversión por lotes de ISO a UTF

¿De casualidad tambien podria funcionar mb_convert_encoding, para hacer lo que quieres hacer con el codigo?
  #4 (permalink)  
Antiguo 14/07/2009, 11:15
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: [Aporte] Pseudo-conversión por lotes de ISO a UTF

Bueno, como estoy convirtiendo un sitio que se que codifique completamente en ISO no crei necesario realizar esas comprobaciones, ademas de que los archivos originales se mantienen intactos y siempre hay manera de volver a intentarlo.

Gracias por las sugerencias, no estara de mas aplicarlas para mejorar este script.

Edito:

En el manual de PHP para utf8_encode encontre la funcion fixEncoding(), no la he probado, pero parece ser la adecuada para codificar solo cuando sea necesario:

Código php:
Ver original
  1. // Funcion publicada por [B]mrezair at azarbod dot com[/B]
  2. // Fixes the encoding to uf8
  3. function fixEncoding($in_str)
  4. {
  5.   $cur_encoding = mb_detect_encoding($in_str) ;
  6.   if($cur_encoding == "UTF-8" && mb_check_encoding($in_str,"UTF-8"))
  7.     return $in_str;
  8.   else
  9.     return utf8_encode($in_str);
  10. } // fixEncoding
  11.  
  12. // El codigo solo habria que agregar la funcion
  13. // Y cambiar:
  14. fwrite($file_utf, utf8_encode($file_cnt));
  15.  
  16. // Por esto:
  17. fwrite($file_utf, fixEncoding($file_cnt));

Gracias nuevamente por la sugerencia.
__________________
- León, Guanajuato
- GV-Foto

Última edición por Triby; 14/07/2009 a las 13:42 Razón: Agregar funcion.
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 15:44.