Newsgroup: it.comp.www.php
Titolo: File di testo

Ciao a tutti.
Ho una pagina PHP (su server unix con apache 1.3) che deve generare un 
file di testo da scaricare.
Viene generato nel seguente modo
header("Content-disposition: attachment; filename=csv-200511.txt");
header("Content-Type: text/plain; charset=windows-1251");
header("Content-Transfer-Encoding: 7bit");
header("Content-Length: ".strlen($txt));
header("Pragma: no-cache");
header("Expires: 0");
echo $txt;
Il problema è che all'inizio del file viene scritto anche un presunto 
"\n" o "\r" che ovviamente se aparto con unix va bene mentre se apro il 
txt con windows viene mostrato il simbolino del carattere sconosciuto.
Come posso 'forzare' il formato a windows?
Ho provato anche a cancellare manualmente il primo carattere del file ma 
  il risultato è sempre quello. qualunque cosa faccio, php aggiunge come 
primo carattere la riga vuota in formato unix.

header("Content-Type: text/plain; charset=windows-1251");
prova con charset=windows-1252 oppure il classico charset=iso-8859-1
Francesco Mazzi
Webmaster di AltroPC.it - 
http://www.altropc.it
 
Dev.Staff di E-Xoopport - 
http://dev.e-xoopport.it

provato ora con entrambi.
il risultato è il medesimo


 Come posso 'forzare' il formato a windows?
Utilizzando dei convertitori da riga di comando
Puoi passare il file temporaneo al programma,
ti sputera' in STDOUT il formato leggibile da windows o viceversa...
~omar


E senza riga di comando?
Mi sembra strano che php non lo faccia da se....
Anche perchè è solo e soltanto nella prima riga.
Viene sempre aggiunto un carrattere non riconosciuto da windows in testa 
al file.

il risultato è il medesimo
Prova a togliere in content-transfer-encoding


> Prova a togliere in content-transfer-encoding
Fatto: non cambia nulla.

Fatto: non cambia nulla.
Comincio a sospettare che sia il file originale a contenere questo
carattere...


 echo $txt;
   ^^^^^^^^^ <- quanto vale $txt;
secondo me questo è il punto, $txt vale quel carattere che stampa in 
quanto senza mettere l'echo il php apre un file di testo vuoto con il 
programma registrato per aprirlo, se te stampi qualcosa automaticamente 
apre e stampa il tuo qualcosa .. quindi la tua variabile $txt ha il 
carattere incriminato  ..
--
[CapoBecchino]
!!! SODDISFATTI O RIMBORSATI !!!
Nessuno si è mai lamentato della nostra offerta 2x1. Morire in 2 e 
pagare per 1.

 carattere...
File originale?
è un
$txt = "CIAO MONDO";
echo $txt;


 carattere incriminato  ..
La mia variabile $txt è la seguente:
$txt = "CIAO MONDO";

echo $txt;
prova a sostituire il tuo content type con questo:
header("Content-type: application/download\n");


 header("Content-type: application/download\n");
Già provato.

Alessandro ha scritto:

ed io ti ripeto che ho copiato pari pari il tuo esempio l'ho incollato 
in dreamweaver, nella mia variabile $txt ho scritto "ciao ciao" ed il 
tutto mi funziona che è una meraviglia senza alcuno spazio iniziale ..
Logicamente mi sembrava inutile dirti che la prova l'ho fatto su win .. 
cmq .. ho usato php5+apache2.0


Già provato.
Puoi postare il codice dell'intero file? Forse ci va a finire
involontariamente un a capo.


 cmq .. ho usato php5+apache2.0
Hai fatto la prova con php per win?

 involontariamente un a capo.
in sostanza inizia qui.
Prima del seguente codice non c'è solo la query mysql.
Ho provato anche a mettere un semplice $txt = "CIAO MONDO"; dentro il 
while (per vedere se era il .= a generare lo spazio) ma il risultato è 
sempre lo stesso: viene fuori uno strano carattere ad inizio file.
-----------------------------------------------------------
$txt = "";
while ( $dati = mysql_fetch_array($result) )	{
	$txt .= 	$dati['seriale']
			.";".date('d-m-Y',$dati['giorno'])
			.";".formatta_ora($dati['ora'])
			."\r\n";
}
header("Content-disposition: attachment; filename=csv-200511.txt");
//header("Content-Type: application/force-download");
header("Content-Type: text/plain; charset=windows-1252");


 Hai fatto la prova con php per win?
certo :) e scusami se non sono stato chiaro ..
--
[CapoBecchino]
Sezione OMICIDI: Non andate altrove a farmi ammazzare, provate la nostra 
nuova sezione omicidi. Garantità nel 97,5% dei casi. (purtroppo x le 
suocere ci stiamo specializzando) :)

 certo :) e scusami se non sono stato chiaro ..
php per win ovviamente da il testo giusto.
Il mio problema è che su unix il "ritorno a capo" è composto da 1 
carattere mentre su win è composto da 2.
Ed io mi ritrovo con un "ritorno a capo" fatto di 1 solo carattere (che 
ovviamente win non riconosce).
Su win mi sembra scontato ed ovvio che tutto funziona.


 
mi sa che c'è qualcosa che non funziona e spero che sia io .. tu hai 
detto che ... il php mette un carattere che non dovrebbe ed io ti ho 
risposto che non è vero .. hai detto che hai fatto una prova con "CIAO 
MONDO" ed io ti ho detto che non è vero ..
Il problema è diverso se tu hai per forza di cose questo carattere e non 
  lo vorresti ..
Ora tu hai questo carattere?? si???  bene ..  come hai fatto per 
cancellare il primo carattere .. posta il codice ..
--
[CapoBecchino]
!!! MEGA SCONTO !!! 3 suocere al prezzo di 2. Contatta i tuoi amici, non 
perdere quest'occasione. :)

 cancellare il primo carattere .. posta il codice ..
$txt = substr( $txt,0,strlen($txt) );
ovviamente non funziona (non per problemi di sintassi, adesso vado a 
memoria e non so se ho scritto bene il substr). Il carattere resta 
sempre li e mi viene tolto il primo carattere di $txt.
Il problema quindi, non è nella variabile, ma nel sistema che in 
automatico stampa un carattere PRIMA del $txt. Solo che PRIMA del echo 
$txt non è presente nulla.

 memoria e non so se ho scritto bene il substr). 
Infatti è sbagliato, cosi ti prende sempre tutti i caratteri contenuti 
nella tua variabile $txt che ti ripeto secondo me il problema è li.
modifica in questo modo :
$txt = substr( $txt,1,strlen($txt)-1);
cosi si che levi solo il primo carattere e prendi tutti gli altri ..


 cosi si che levi solo il primo carattere e prendi tutti gli altri ..
Infatti è cosi ho sbagliato a scrivere pardon.....
il carattere resta sempre li però mi toglie il primo carattere della 
variabile $txt..
quindi presumo che il problema sia PRIMA dell' echo $txt. il problema è 
che prima non c'è nulla che stampa.

txt con windows viene mostrato il simbolino del carattere sconosciuto.
Fai cosi': creati una funzione
function diebad()
{
	$txt = 'HELLO, WORLD';
	header("Content-disposition: attachment;
filename=csv-200511.txt");
	header("Content-Type: text/plain; charset=windows-1251");
	header("Content-Transfer-Encoding: 7bit");
	header("Content-Length: ".strlen($txt));
	header("Pragma: no-cache");
	header("Expires: 0");
	print $txt;
	die();
}
e spostala sempre piu' verso l'inizio del tuo codice. In qualche include
o simile, ci dev'essere un "\n". Quando scompare nell'output, sai che il
colpevole e' subito dopo:
	include "functions.php"
	diebad(); // 6. Qui funziona
	include "session.php"
	// diebad(); // 5. Qui ancora non funziona
	include "variables.php"
	// diebad(); // 4. Qui ancora non funziona
...qui il colpevole e' session.php: magari, perche' dopo il ?> e' finita
una riga vuota.
Ma sei sicuro che sia SEMPRE un \n, anche se cambi il testo? Per esempio
se metti esattamente cosi':
	$txt = "Quel ramo del lago di Como che volge a mezzogiorno, tra
due catene";
non e' che ti viene fuori, che so... una "C"?
Leonardo
-- 
Avere studiato senza mettere in pratica e' inutile;
mettere in pratica senza avere studiato e' pericoloso.
                                                - Conphpucio