2011-01-29 19 views
42

Tengo un montón de archivos que no están en codificación UTF-8 y estoy convirtiendo un sitio a codificación UTF-8.¿Cómo escribir un archivo en formato UTF-8?

estoy usando script sencillo para los archivos que desea guardar en UTF-8, pero los archivos se guardan en la antigua codificación:

header('Content-type: text/html; charset=utf-8'); 
mb_internal_encoding('UTF-8'); 
$fpath="folder"; 
$d=dir($fpath); 
while (False !== ($a = $d->read())) 
{ 

if ($a != '.' and $a != '..') 
    { 

    $npath=$fpath.'/'.$a; 

    $data=file_get_contents($npath); 

    file_put_contents('tempfolder/'.$a, $data); 

    } 

} 

¿Cómo puedo guardar archivos en codificación UTF-8?

Respuesta

40

file_get_contents/file_put_contents no convertirá mágicamente la codificación.

Tienes que convertir la cadena explícitamente; por ejemplo, con iconv() o mb_convert_encoding().

Prueba esto:

$data = file_get_contents($npath); 
$data = mb_convert_encoding($data, 'UTF-8', 'OLD-ENCODING'); 
file_put_contents('tempfolder/'.$a, $data); 

O, alternativamente, con filtros de secuencia de PHP:

$fd = fopen($file, 'r'); 
stream_filter_append($fd, 'convert.iconv.UTF-8/OLD-ENCODING'); 
stream_copy_to_stream($fd, fopen($output, 'w')); 
+1

@MarkBaker - ¿Cómo son las transmisiones más eficientes? – Webnet

+3

Más eficiente en este caso porque los datos que se recuperan se alimentan directamente a través de la función de conversión y al flujo de salida sin necesidad de almacenamiento intermedio, o transferencia a memoria PHP y luego a –

+1

¿El orden del filtro de flujo no es incorrecto? – Maarten

3

En Unix/Linux un simple comando shell podría utilizarse como alternativa para convertir todos los archivos de un directorio dado:

recode L1..UTF8 dir/* 

se podría iniciar a través de los PHP exec() también.

+0

No sabía acerca de este comando. ¡Gracias! Uso Linux incluso como estación de trabajo, todos mis servidores locales están en Linux. ¿Y qué significa L1 .. en el comando? – Starmaster

+0

@Starmaster: L1 es la abreviatura de Latin-1, el juego de caracteres fuente. – mario

57

Añadir lista de materiales: UTF-8

file_put_contents($myFile, "\xEF\xBB\xBF". $content); 
+0

Esta debería ser la respuesta aceptada ... corta y dulce, ¡y funciona! –

0

Si desea utilizar recodificación de forma recursiva, y el filtro para el tipo, intente esto:

find . -name "*.html" -exec recode L1..UTF8 {} \; 
20
 
<?php 
function writeUTF8File($filename,$content) { 
     $f=fopen($filename,"w"); 
     # Now UTF-8 - Add byte order mark 
     fwrite($f, pack("CCC",0xef,0xbb,0xbf)); 
     fwrite($f,$content); 
     fclose($f); 
} 
?> 
+0

Estaba tratando de crear un script de descarga de php para poder usar UTF-8 para caracteres daneses, esto es lo que faltaba, ty – cuzzea

+0

+1 de mi :). Salvaste mis horas – NullPointer

+0

nice usando pack() –

0

Esto funciona para mí. :)

$f=fopen($filename,"w"); 
# Now UTF-8 - Add byte order mark 
fwrite($f, pack("CCC",0xef,0xbb,0xbf)); 
fwrite($f,$content); 
fclose($f); 
+0

Esto funcionó para mí, descargando páginas aspx que estaban codificadas con utf, en una plataforma de Windows. – Tschallacka

1
//add BOM to fix UTF-8 in Excel 
fputs($fp, $bom =(chr(0xEF) . chr(0xBB) . chr(0xBF))); 

llegué esta línea de Cool

-5
  1. Abre los archivos en las ventanas portátil
  2. cambiar la codificación a ser una codificación UTF-8
  3. guardar el archivo
  4. ¡Inténtalo de nuevo! : O)
-1

puse todos juntos y tengo manera fácil de convertir archivos de texto ANSI a "UTF-8 Sin marca":

function filesToUTF8($searchdir,$convdir,$filetypes) { 
    $get_files = glob($searchdir.'*{'.$filetypes.'}', GLOB_BRACE); 
    foreach($get_files as $file) { 
    $expl_path = explode('/',$file); 
    $filename = end($expl_path); 
    $get_file_content = file_get_contents($file); 
    $new_file_content = iconv(mb_detect_encoding($get_file_content, mb_detect_order(), true), "UTF-8", $get_file_content); 
    $put_new_file = file_put_contents($convdir.$filename,$new_file_content); 
    } 
} 

Uso: filesToUTF8 ('C:/temp /', 'C:/Temp/conv_files /', 'php, txt');

Cuestiones relacionadas