2012-01-05 11 views
5

Mam plik znajdujący się w katalogu z duńskimi znakami na komputerze z systemem Windows XP. Używam Strawberry Perl i chciałbym przeczytać ten plik. Poniższy kod działa poprawnie:Jak odczytać plik o długiej nazwie pliku z unicode w Strawberry Perl nie używając 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); 

Procedura getOpenFile pochodzi od Tk. Teraz z jakiegoś powodu Win32 :: Unicode :: File ma kilka niefortunnych efektów ubocznych, z którymi nie mogę żyć (zjada moją pamięć, zobacz "Out of memory" with simple Win32::Unicode::File readline loop and Strawberry Perl). Teraz jeśli spróbuję otworzyć plik bez interfejsu Win32 :: Unicode :: File, otrzymam plik nie znaleziony. Powodem tego jest niewłaściwa interpretacja ścieżki. Próbowałem przekonwertować ścieżkę zgodnie z Perl: managing path encodings on Windows, który nie działa z jakiegoś powodu. Jak mam to rozwiązać? Próbowałem następujące:

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

i nie działa. Jakieś pomysły?

Proszę wybaczyć mi, jeśli jestem niejasna.

poważaniem, Michael

+1

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

+1

metinks powinieneś używać UTF16 jako kodowania. Jak wygląda nazwa $ fname w debugerze? –

Odpowiedz

5
encode("utf8" 

Perl będzie przy użyciu biblioteki standardowej C Funkcje IO do otwierania plików, a na Windows, gdzie nazwy plików są natywnie Unicode (UTF-16 za kulisami) co oznacza, że ​​biblioteki musi interpretować nazwę pliku w interfejsie zorientowanym na bajt, jako będącym w określonym kodowaniu.

Oto problem: wybrane kodowanie nigdy nie jest UTF-8 ani żadnym innym UTF. Jest to domyślne kodowanie regionalne, znane (mylnie) jako strona kodowa ANSI. W instalacji systemu Windows Zachodnia: cp-1252. Ogólnie możesz dowiedzieć się, co to jest, dzwoniąc pod numer Win32::Codepage::get_encoding.

Przekształcając ciąg znaków w kodowanie, można uzyskać do niego dostęp, korzystając z obsługi plików natywnych, o długości, wszystkie znaki w ścieżce pliku znajdują się na stronie kodowej ANSI. Dla duńskiego na maszynie zachodniej, to jest w porządku; w przypadku języka duńskiego na maszynie chińskiej lub odwrotnie, zawsze otrzymasz błąd braku pliku.

Jeśli więc chcesz obsługiwać nazwy plików ze wszystkimi znakami Unicode w systemie Windows, nie masz wyboru i musisz użyć interfejsu API Win32, ponieważ działa to pod Win32::Unicode::File. Nie dotyczy to wyłącznie języka Perl; inne języki bez jawnej obsługi nazw plików w Unicode mają dokładnie ten sam problem.

+0

Dziękuję. Świetna odpowiedź. :) –