Ver Mensaje Individual
  #1 (permalink)  
Antiguo 14/07/2009, 00:59
Avatar de Triby
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