2011-01-29 20 views
42

UTF-8エンコーディングではないファイルがたくさんあり、サイトをUTF-8エンコーディングに変換しています。ファイルをUTF-8形式で書き込む方法は?

私はUTF-8で保存したいファイルのための簡単なスクリプトを使用していますが、ファイルは古いエンコーディングで保存されます。

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

    } 

} 

は、どのように私は、UTF-8エンコーディングでファイルを保存することができますか?

答えて

40

file_get_contents/file_put_contentsは魔法のようにエンコードを変換しません。

文字列を明示的に変換する必要があります。たとえばiconv()またはmb_convert_encoding()となります。救助に

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

@ MarkBaker - ストリームはどのように効率的ですか? – Webnet

+3

取り出したデータが、中間記憶やPHPメモリへの転送の必要なしに直接convert関数と出力ストリームに供給されているので、この場合は効率的です –

+1

ストリームフィルタの順序は間違っていませんか? – Maarten

5

Iconv

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

または代わりに、PHPのストリームフィルタを持つ:

はこれを試してみてください。簡単なシェルコマンドは、指定されたディレクトリからすべてのファイルを変換する代わりに使用することができたのUnix/Linuxでは

3

recode L1..UTF8 dir/* 

も同様にPHPS幹部()を介して起動することでした。

+0

このコマンドについて知りませんでした。ありがとう!私はワークステーションとしてもLinuxを使用しています。私のローカルサーバーはすべてLinux上にあります。そして、L1は何を意味するのでしょうか? – Starmaster

+0

@Starmaster:L1は、ソー​​スの文字セットであるLatin-1の省略形です。 – mario

57

はBOMを追加します:あなたが再帰的に再符号化を使用する場合はUTF-8

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

これは受け入れられた答えである必要があります...短くて甘い、そして動作します! –

0

、およびタイプのためにフィルタリングし、これを試してみてください。

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

デンマーク語の文字にUTF-8を使用するためにphpダウンロードスクリプトを作成しようとしていましたが、これは欠けていたものです。私から – cuzzea

+0

+1です。あなたは私の時間を保存しました – NullPointer

+0

pack()を使用していいです –

0

これは私のために動作します。 :)

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

これは、Windowsプラットフォームにutfでエンコードされたaspxページをダウンロードしてくれました。 – Tschallacka

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

私は

  • があなたのファイルを保存してUTF-8エンコーディングであることを、Windowsのノートブック
  • 変更エンコーディングでファイルを開きCool

  • -5
    1. から、このラインを持っ
    2. もう一度お試しください! :O)私はすべて一緒に入れて、ANSIテキストファイルを "UTF-8ノーマーク" を変換する簡単な方法だ
    -1

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

    使用法:filesToUTF8( 'C:/温度/' を、 'C:/ Temp/conv_files /'、 'php、txt');

    関連する問題