2012-01-05 13 views
5

Ho un file che si trova in una directory, con caratteri danesi, su una macchina Windows XP. Io uso Strawberry perl e vorrei leggere questo file. Il seguente codice funziona correttamente:Come leggere un file con nome file lungo con unicode in perl Strawberry senza utilizzare Win32 :: Unicode :: File?

use Win32::Unicode::File; 
    # Some code left out.... 
    $fname = $mw -> getOpenFile(-filetypes=>$types); 
    my $fh = Win32::Unicode::File->new; 
    $fh->open('<', $fname); 

La routine getOpenFile proviene da Tk. Ora per qualche ragione Win32 :: Unicode :: File ha alcuni sfortunati effetti collaterali che non posso convivere con (mi mangia la memoria, vedi "Out of memory" with simple Win32::Unicode::File readline loop and Strawberry Perl). Ora se provo ad aprire il file senza l'interfaccia Win32 :: Unicode :: File ottengo un file non trovato. La ragione di ciò è che il percorso viene interpretato erroneamente. Ho provato a convertire il percorso in base a Perl: managing path encodings on Windows che non funziona per qualche motivo. Come dovrei risolvere questo? Ho provato il seguente:

use Encode; 
    # Some code left out.... 
    $fname = $mw -> getOpenFile(-filetypes=>$types); 
    my $fh; 
    open($fh, '<', encode("utf8",$fname,Encode::FB_CROAK)); 

e non funziona. Qualche idea?

Per favore perdonami se non sono chiaro.

Cordiali saluti, Michael

+1

Alternative: http://p3rl.org/PerlIO::fse http://p3rl.org/Path::Class::Unicode – daxim

+1

methinks è necessario utilizzare UTF16 come codifica. Come appare $ fname nel debugger? –

risposta

5
encode("utf8" 

Perl sarà utilizzando la libreria funzioni standard C IO per aprire i file, e su Windows in cui nomi di file sono nativamente Unicode (UTF-16 dietro le quinte), questo significa che la biblioteca deve interpretare il nome del file in quell'interfaccia orientata ai byte come in una particolare codifica.

Ecco il problema: la codifica selezionata non è mai UTF-8 o qualsiasi altra UTF. È la codifica predefinita specifica della locale, conosciuta (in modo fuorviante) come la tabella codici ANSI. Su un'installazione di Windows occidentale che è cp-1252. In generale puoi scoprire che cos'è chiamando Win32::Codepage::get_encoding.

Quindi, convertendo la stringa in quella codifica, è possibile accedervi utilizzando il supporto file nativo, finchè tutti i caratteri nel percorso del file si trovano nella tabella codici ANSI. Per il danese su una macchina occidentale va bene; per il danese su una macchina cinese, o viceversa, otterrai sempre un errore non trovato.

Quindi, se si desidera supportare i nomi di file con tutti i caratteri Unicode in Windows, non è possibile utilizzare l'API Win32, come invece fa Win32::Unicode::File. Questo non è unico per Perl; altre lingue senza il supporto esplicito per i nomi di file Unicode hanno esattamente lo stesso problema.

+0

Grazie. Bella risposta. :) –

Problemi correlati