Come posso verificare l'esistenza di UTF-16 i nomi dei file in Perl?
Domanda
Ho un file di testo codificato in UTF-16. Ogni riga contiene un numero di colonne separate da tabulazioni. Per coloro che hanno a cuore, il file è un export playlist TXT da iTunes. Colonna # 27 contiene un nome di file.
Sto leggendo utilizzando Perl 5.8.8 in Linux utilizzando codice simile a:
binmode STDIN, ":encoding(UTF-16)";
while(<>)
{
chomp;
my @cols = split /\t/, $_;
my $filename = $cols[26]; # Column #27 contains the filename
print "File exists!" if (-e "$filename");
}
(Si prega di notare:. Ho abbreviato questo frammento di codice Nel mio codice vero e faccio alcune sostituzioni per convertire il nome del file di Windows assoluta usata da iTunes in un nome di file valido sulla mia macchina Linux)
Anche se i file esistono, il file di test (-e) non restituisce vero. Credo che abbia qualcosa a che fare con la stringa di essere in UTF-16, ma non riesce a capire quale sia il problema. Il nome del file attuale utilizza solo caratteri ASCII. E le stampe filename correttamente se stampare la variabile $ nomefile.
Può nomi di file in Perl in UTF16? Delle idee come ottenere questo frammento di codice a lavorare?
Soluzione
Il testo UTF-16 viene elaborato dal: strato codifica. Con il tempo si arriva in $_
, non c'è modo di dire che era sempre UTF-16. Io non credo che sia il problema.
La mia ipotesi è che hai neanche avuto qualche spazio vuoto nel nome del file (che non hai notato quando si è tentato di stampare fuori) o non siete nella directory ti credi di essere.
Prova
if (-e $filename) { print "File exists!" }
else { print "File <$filename> not found" }
e controllare con attenzione il nome del file. Si potrebbe anche use Cwd;
e stampare la directory corrente.
Altri suggerimenti
ho capito la soluzione:
Colonna 27 è l'ultima colonna, e il file è codificato con 0d0a (\ r \ n) la fine della riga. chomp stava rimuovendo solo 0a (\ n). Non so perché non ho visto questo prima, ma non ha nulla a che fare con UTF16.
Aggiunta:
s/\r$//;
dopo chomp risolve il problema.
Grazie per il vostro aiuto -. Mi dispiace per l'invio di un sentiero di coniglio
Se, come dici tu, il nome del file attuale utilizza solo caratteri ASCII, non sarebbe
$filename =~ s/\0//g;
lavorare? In ogni caso, xxd
dovrebbe aiutare la prossima volta che si esegue in qualcosa di simile
[sinan@archardy ~]$ xxd /mnt/c/Documents\ and\ Settings/sinan/Desktop/test.txt 0000000: fffe 2f00 6800 6f00 6d00 6500 2f00 7300 ../.h.o.m.e./.s. 0000010: 6900 6e00 6100 6e00 2f00 7400 6500 7300 i.n.a.n./.t.e.s. 0000020: 7400 6d00 6500 2e00 7400 7800 7400 0d00 t.m.e...t.x.t... 0000030: 0a00 ..
Vedo che avete risolto il problema nel tempo che mi ha portato a creare un file di test e di riavviare in Linux. Oh, bene.