5

Windows XP マシンのディレクトリに、デンマーク語の文字を含むファイルがあります。Strawberry 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 から来ています。何らかの理由で Wi​​n32::Unicode::File には、私が耐えられない不幸な副作用があります (それは私のメモリを食い尽くします。単純な Win32::Unicode::File readline ループと Strawberry Perl による「メモリ不足」を参照してください)。Win32::Unicode::File インターフェイスを使用せずにファイルを開こうとすると、ファイルが見つからないというメッセージが表示されます。これは、パスが正しく解釈されないことが原因です。Perlに従ってパスを変換しようとしました:なんらかの理由で動作しないWindows でのパス エンコーディングの管理。これをどのように解決すればよいですか?私は次のことを試しました:

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

そしてそれは機能しません。何か案は?

不明な場合はご容赦ください。

敬具、マイケル

4

1 に答える 1

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 ファイル名を明示的にサポートしていない他の言語にも、まったく同じ問題があります。

于 2012-01-05T19:38:22.967 に答える