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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top