【问题标题】:How to read a file with long file name with unicode in Strawberry perl not using Win32::Unicode::File?如何在不使用 Win32::Unicode::File 的 Strawberry perl 中使用 unicode 读取具有长文件名的文件?
【发布时间】:2012-02-03 06:31:13
【问题描述】:

我有一个文件位于 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 有一些我无法忍受的不幸副作用(它会吞噬我的记忆,请参阅"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));

它不起作用。有什么想法吗?

如果我不清楚,请原谅我。

亲切的问候, 迈克尔

【问题讨论】:

标签: perl unicode character-encoding windows-xp strawberry-perl


【解决方案1】:
encode("utf8"

Perl 将使用标准 C 库 IO 函数来打开文件,并且在 Windows 上,文件名本身是 Unicode(幕后的 UTF-16),这意味着库必须将面向字节的接口中的文件名解释为在特定的编码中。

问题是:选择的编码绝不是 UTF-8 或任何其他 UTF。它是特定于语言环境的默认编码,称为(误导性地)ANSI 代码页。在西式 Windows 上安装 cp-1252。一般情况下,您可以致电Win32::Codepage::get_encoding 了解它是什么。

因此,通过将字符串转换为该编码,您可以使用本机文件支持访问它,只要文件路径中的所有字符都在 ANSI 代码页中。对于西方机器上的丹麦语,没关系;在中文机器上使用丹麦语,反之亦然,您总是会收到一个 file-not-found 错误。

所以如果你想在 Windows 上支持所有 Unicode 字符的文件名,你别无选择,只能使用 Win32 API,就像Win32::Unicode::File 一样。这不是 Perl 独有的。其他没有明确支持 Unicode 文件名的语言也有完全相同的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    • 2014-06-17
    • 1970-01-01
    • 2011-08-24
    • 1970-01-01
    • 2011-01-28
    • 2017-10-01
    相关资源
    最近更新 更多