2012-01-05 43 views
5

我有一個文件位於Windows XP機器上的一個目錄中,其中有丹麥語字符。我使用Strawberry perl並希望閱讀此文件。以下代碼正常工作:如何在不使用Win32 :: Unicode :: File的情況下使用unicode在草莓perl中讀取長文件名的文件?

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

getOpenFile例程來自Tk。由於某種原因,Win32 :: Unicode :: File有一些不幸的副作用,我無法忍受(它吃掉了我的內存,請參閱"Out of memory" with simple Win32::Unicode::File readline loop and Strawberry Perl)。現在,如果我嘗試在沒有Win32 :: Unicode :: File接口的情況下打開文件,我會收到一個找不到的文件。原因是路徑得到了不正確的解釋。我試圖根據Perl: managing path encodings on Windows轉換路徑,因爲某些原因無法正常工作。我應該如何解決這個問題?我試過以下內容:

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

而且它不起作用。有任何想法嗎?

請原諒我,如果我不清楚。

親切的問候, 邁克爾

+1

替代選項:http://p3rl.org/PerlIO::fse http://p3rl.org/Path::Class::Unicode – daxim 2012-01-05 12:34:55

+1

你應該使用UTF16作爲編碼。 $ fname在調試器中看起來如何? – 2012-01-05 14:55:36

回答

5
encode("utf8" 

的Perl將使用標準C庫IO函數打開文件,而在Windows上,其中文件名本身使用Unicode(UTF-16在幕後),這意味着庫必須將該面向字節接口中的文件名解釋爲處於特定編碼中。

下面是問題:挑選的編碼從來不是UTF-8或任何其他UTF。它是特定於語言環境的默認編碼,作爲ANSI代碼頁已知(誤導性)。在西部Windows安裝cp-1252。一般來說,您可以撥打Win32::Codepage::get_encoding來了解它是什麼。

因此,通過轉換您的字符串是在該編碼,您可以使用本機文件支持訪問它,只要都在該文件的路徑字符是在ANSI代碼頁。對於丹麥人來說,在西方機器上可以;在中文機器上使用丹麥語,反之亦然,您將始終得到文件未找到的錯誤。

因此,如果你想在Windows上支持全部Unicode字符的文件名,你別無選擇,只能使用Win32 API,因爲Win32::Unicode::File可以。這不是Perl獨有的;沒有明確支持Unicode文件名的其他語言具有完全相同的問題。

+0

謝謝。很好的答案。 :) – 2012-01-06 00:14:35

相關問題