2009-06-24 5 views
0

알겠습니다. 문제가 있습니다. 응용 프로그램을 저장하는 데 사용되는 Linux 웹 서버 (Apache 2가 설치된 RHEL 4)가 있습니다. 이 응용 프로그램의 일부는 PHP 스크립트 세트입니다. 양식 변수를 받아들이고 파일을 사용자에게 다운로드하는 스크립트를 만들었습니다. 여기에 코드 :Linux에서 Windows로 파일을 다운로드 할 때 파일 끝을 수정했습니다.

header('Content-Description: File Transfer'); 
header('Content-Type: application/octet-stream'); 
header('Content-Disposition: attachment; filename='.$destFileName); 
header('Expires: 0'); 
header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); 
header('Pragma: public'); 
header('Content-Length: ' . filesize($fullPath)); 
ob_clean(); 
flush(); 
readfile($fullPath); 

이 모든 것이 제대로 작동하고 파일이 다운로드됩니다. 그러나 문제가 있습니다. 이 파일들은 리눅스 머신에서 Windows 머신으로 다운로드됩니다 (항상). 문제는 인코딩입니다. Linux 상자에서 파일을 보면 모든 텍스트가 정렬되고 모든 열이 잘 보입니다. (파일은 단순 텍스트 파일입니다.) 그러나 파일이 Windows 상자에 다운로드되고 메모장에서 열리면 파일이 모두 파열되고 아무 것도 정렬되지 않습니다. 또한 이상한 문자 (상자처럼 보이지만 그것은 알려지지 않은 문자에 대한 일반적인 표현입니다)를 보게됩니다. 이 파일을 다른 프로그램으로 가져 오면 작동하지 않습니다.

그러나 워드 패드에서 파일을 열면 모든 텍스트가 올바르게 보입니다. 단어장에서 저장하면 올바르게 가져오고 Notpad에서 올바르게 표시됩니다.

파일 인코딩에 대한 지식이별로 없기 때문에 다운로드 할 사용자에게 보내기 전에 파일을 인코딩하는 방법에 대한 정보는 훌륭합니다.

$handle = @fopen($fullPath, "r"); 
if ($handle) { 
    while (!feof($handle)) { 
     $buffer = fgets($handle); 
     $buffer = str_replace('\n', '\r\n', $buffer); 
     echo $buffer; 
    } 
    fclose($handle); 
} 

감사 :

은 내가 readfile($fullPath);로 교체하려고했다!

+0

그냥 경우에 사람이 비슷한 문제로 여기에 온다 : '\의 n은'리터럴 문자 시퀀스 백 슬래시-n은 줄 바꿈 메모장/편집기에서 상자로 전환하지만 워드 패드에서 잘 보면, 그것은하지의 문제 Windows linebreaks를 사용하여 (메모 패드는 linebreaks에 대해 꽤 항문입니다. 다른 문자가 보이는 경우 인코딩 문제 (예 : UTF-8이 Windows-1252 또는 US-ASCII로 처리됨)를 처리하고있는 것입니다. –

답변

2

다음 줄에 문제가있다. "\ n"은 개행 문자입니다.

# php -r "var_dump('\n', \"\n\");" 
string(2) "\n" 
string(1) " 
" 
1

도움이 될만한 유닉스 유틸리티 'unix2dos'와 'dos2unix'가 있습니다. PHP에서 시스템 호출로 호출 할 수 있습니다.

또는 나는 같은 물건의 PHP 버전이있을 것이라고 확신합니다.

하지만 저는 PHP 사람이 아닙니다.

+0

나는이 아이디어가 마음에 든다. 아마도 그것은 개행을 도스 형식으로 업데이트하는 것 이상의 일일 것이다. 문제는 PHP에서 실행하려고 할 때 응답이 없다는 것입니다. 누구든지 도움이됩니다. – alanquillin

+0

아, 파일을 수정해야합니다. sys ('unix2dos', $ fullPath, $ fullPath. "_ dos") 그런 다음 _dos 파일을 보내십시오. 그런 다음 삭제하십시오. 이상적은 아닙니다. –

-1

편집 : 나는 PHP 인용에 대해 몰랐다. 하지만 여러 언어를 사용할 때 표준 인코딩을 결정해야 할 수도 있습니다. 나머지는 여전히 유효합니다.

일반적으로 Windows는 시스템에 로컬 인 문자 집합을 사용하여 텍스트에 ANSI 또는 ASCII 인코딩 파일을 사용합니다. (cp1252와 유사).

UTF8로 모두 인코딩하는 것이 가장 쉬운 방법 일 수 있습니다. 그런 다음 메모장에 UTF8 문서로 파일을 읽으라고 지시하는 것이 가장 쉽습니다. (파일 -> 열기 대화 상자의 드롭 다운입니다.)

명령 줄에서 인코딩을 지정하는 방법이 표시되지 않으며 메모장에서 자동으로 찾을 수 있는지 확신하지 못합니다. 당신이 따옴표를 사용해야 할 것

$buffer = str_replace('\n', '\r\n', $buffer); 

: