5

私は、Windows XPマシン上でディレクトリにデンマーク語の文字を含むファイルを持っています。私はStrawberry perlを使い、このファイルを読んでみたいと思います。次のコードは正常に動作します。Win32 :: Unicode :: Fileを使用していないStrawberry perlで、長いファイル名のファイルをUnicodeで読み取るには?

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

+1

あなたはエンコーディングとしてUTF16を使うべきです。 $ fnameはデバッガでどのように見えるのですか? –

答えて

5
encode("utf8" 

Perlはファイルを開くには、標準CライブラリのIO機能を使用すると、Windows上のファイル名は、ネイティブライブラリを意味したUnicode(UTF-16舞台裏)どこそのバイト指向のインターフェースのファイル名を特定のエンコーディングとして解釈する必要があります。

問題は次のとおりです。エンコーディングの選択は決してUTF-8、または他のUTFではありません。これはANSIコードページとして知られている(誤解を招きやすい)ロケール固有のデフォルトエンコーディングです。西洋のWindowsインストールではcp-1252です。一般的には、Win32::Codepage::get_encodingと呼んで、それが何であるかを知ることができます。

文字列をそのエンコードに変換すると、のネイティブファイルサポートを使用してアクセスできます。ファイルパス内のすべての文字がANSIコードページにあります。西洋のマシンでデンマークのためにはOKです。中国語のマシンでデンマーク語を使用している場合、またはその逆の場合は、常にファイルが見つかりませんというエラーが表示されます。

Windows上ですべてのUnicode文字を含むファイル名をサポートしたい場合は、Win32::Unicode::FileのようにWin32 APIを代わりに使用するしかありません。これはPerl固有のものではありません。 Unicodeのファイル名を明示的にサポートしていない他の言語でも、まったく同じ問題があります。

+0

ありがとうございます。素晴らしい答え。 :) –

関連する問題