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。现在由于某种原因 Win32::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 回答