Php Windows Linux bir dosya indirirken dosya endcoding Fix

3 Cevap php

Tamam ben bir sorun var. Ben bir Linix web sunucusu bir uygulama barındırmak için kullanılır (apache 2 ile RHEL 4) var. Bu uygulamanın bir parçası php komut kümesidir. Bazı form değişkenleri kabul eder ve sonra kullanıcıya bir dosyayı karşıdan bir senaryo oluşturduk. İşte kod si:

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

Bu, tüm çalışıyor ve dosya indirilmiş olur. Ama bir sorun var. Bu dosyalar Windows makinede (HER ZAMAN) için, Linux kutusundan indirilen edilmektedir. Sorun kodlama. Eğer Linix kutusunda dosyasına baktığınızda tüm metin hizalanmış ve tüm sütunlar iyi görünüyorsun. (Dosyaları sadece düz metin dosyalarıdır). Dosya, Windows kutusunda üzerine indirilen ve Not Defteri'nde açılır aldığında ancak, dosya tüm kadar faul olduğunu ve hiçbir şey hizalanmış. Ayrıca, (bir kutu gibi görünüyor olanlar, ancak bilinmeyen charactor sadece genel temsilidir) garip charactors bkz. Bu dosya başka bir program içine alındığında, bu çalışmıyor.

Ben WordPad dosyayı açmak Ancak, tüm metin doğru bakmak. Ben wordpad onu kurtarmak eğer doğru ithalat ve Notpad doğru bakacağız.

Ben dosya kodlama çok knowlege yok, bu yüzden indirmek için kullanıcıya göndermeden önce dosya kodlamak konusunda herhangi bir bilgi çok iyi olurdu.

Ben readfile ($ FullPath) değiştirmeyi deneyin vermedi; ile:

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

Teşekkürler!

3 Cevap

Aşağıdaki satır ile bir sorunu var:

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

Orada çift tırnak kullanmanız gerekiyordu. "\ N" satır olduğunu. '\ N' literal karakter dizisi eğik çizgi-n:

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

Unix yardımcı programında 'Unix2Dos' ve 'dos2unix' yardımcı olabilir vardır. Bir sistem çağrısı olarak php diyebiliriz.

Ya da, ben aynı şeyi bir php sürümü var eminim.

Ama ben bir php adam değilim.

EDIT: Ben yaklaşık PHP alıntı olduğunu bilmiyordum. Yine de, birden fazla dil kullanılacak olduğunda, bu yazının geri kalanı hala geçerli olan standart bir kodlama karar gerekebilir.

, Windows genellikle sisteme yerel karakter kümesini kullanarak, metin için ANSI veya ASCII kodlanmış dosyaları kullanır. (Gibi cp1252).

Bu sadece UTF8 tüm kodlamak kolay olabilir, ve sonra bir UTF8 belge olarak dosyayı okumak için Not Defteri söyleyebilir. (Bu Dosya-> Aç iletişim kutusunda bir damla-aşağı.)

Ben komut satırından kodlamasını belirtmek için bir yol göremiyorum, ve ben not defteri otomatik olarak bulacaktır emin değilim.