2011-01-29 5 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()입니다.

이 시도 : 또는

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

또는를, 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 - 스트림은 어떻게보다 효율적입니까? – Webnet

+3

검색되는 데이터가 중간 저장 공간이나 PHP 메모리로 전송 된 후 다시 출력하지 않고 convert 함수와 출력 스트림을 통해 직접 공급되기 때문에이 경우보다 효율적입니다. –

+1

스트림 필터 순서가 잘못되지 않았습니까? – Maarten

5

Iconv합니다. 간단한 쉘 명령은 주어진 디렉토리에서 모든 파일을 변환하는 대안 적으로 사용될 수있는 유닉스/리눅스에

3

:

recode L1..UTF8 dir/* 

은 물론 PHPs 간부()를 통해 시작 될 수 있습니다.

+0

이 명령에 대해 몰랐습니다. 감사! 나는 워크 스테이션으로 리눅스를 사용한다. 모든 로컬 서버는 리눅스에있다. 그리고 명령에서 L1 ..은 무엇을 의미합니까? – Starmaster

+0

@Starmaster : L1은 소스 charset 인 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

이것은 나를 위해 일했으며, utf로 인코딩 된 aspx 페이지를 Windows 플랫폼에 다운로드했습니다. – Tschallacka

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

나는

  • 이 파일을 저장 UTF-8 인코딩으로 윈도우 노트북
  • 변경 인코딩으로 파일을 열고 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');

    관련 문제