2011-01-29 11 views
42

Ho un sacco di file che non sono in codifica UTF-8 e sto convertendo un sito in codifica UTF-8.Come scrivere file in formato UTF-8?

sto usando semplice script per i file che voglio salvare in UTF-8, ma i file vengono salvati nella codifica antiche:

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); 

    } 

} 

Come posso salvare i file in codifica UTF-8?

risposta

40

file_get_contents/file_put_contents non convertirà magicamente la codifica.

Devi convertire la stringa esplicitamente; ad esempio con iconv() o mb_convert_encoding().

Prova questo:

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

Oppure, in alternativa, con filtri flusso di 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 - In che modo gli stream sono più efficienti? – Webnet

+3

Più efficiente in questo caso perché i dati che vengono recuperati vengono alimentati direttamente tramite la funzione di conversione e il flusso di output senza alcuna necessità di memorizzazione intermedia, oppure trasferiti alla memoria PHP e quindi nuovamente fuori –

+1

L'ordine del filtro di flusso non è errato? – Maarten

3

In Unix/Linux un semplice comando di shell potrebbe essere utilizzato in alternativa per convertire tutti i file da una determinata directory:

recode L1..UTF8 dir/* 

potrebbe essere avviato tramite phps exec() pure.

+0

Non conoscevo questo comando. Grazie! Uso Linux anche come workstation, tutti i miei server locali sono su Linux. E cosa significa L1 .. nel comando? – Starmaster

+0

@Starmaster: L1 è una scorciatoia per Latin-1, il set di caratteri sorgente. – mario

57

Aggiungi BOM: UTF-8

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

Questa dovrebbe essere la risposta accettata ... breve e dolce, e funziona! –

0

Se si desidera utilizzare recode in modo ricorsivo, e filtro per tipo, provate questo:

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

Stavo cercando di creare uno script di download php per usare UTF-8 per i caratteri danesi, questo è quello che mancava, ty – cuzzea

+0

+1 da me :). Hai risparmiato i miei orari – NullPointer

+0

usando il pack() –

0

Questo funziona per me. :)

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

Questo ha funzionato per me, scaricando le pagine di aspx che erano codificate con utf, su una piattaforma Windows. – Tschallacka

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

ho ricevuto questa linea da Cool

-5
  1. Apri i tuoi file in Windows notebook
  2. modificare la codifica di essere una codifica UTF-8
  3. salvare il file
  4. Riprova! : O)
-1

ho messo tutto insieme e avuto modo semplice per convertire i file di testo ANSI a "UTF-8 No Mark":

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); 
    } 
} 

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