perl - 如何在不使用 Win32::Unicode::File 的 Strawberry perl 中使用 unicode 读取具有长文件名的文件?

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

我有一个文件位于 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 接口(interface)的情况下打开文件,我会发现找不到文件。原因是路径被错误地解释了。我试过根据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));

它不起作用。有任何想法吗?

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

亲切的问候,
迈克尔

最佳答案

encode("utf8"

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

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

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

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

关于perl - 如何在不使用 Win32::Unicode::File 的 Strawberry perl 中使用 unicode 读取具有长文件名的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8742405/

相关文章:

perl - '\' 在 Perl 中是什么意思?

linux - 如何获取执行我的 Perl 脚本的用户的名称?

c - 如何将宽字符串文字与 PRId32、PRIu64 等连接起来?

php - 阿拉伯语编码的数据库问题

mysql - Perl 从字符串中删除无效字符、无效的 latin1 字符

windows - 我如何交付(分发)Perl 应用程序?

regex - Notepad++正则表达式替换命名组

python - 在 Windows 记事本的 Python 中创建 UTF-16 换行符

java - 使用移位操作将 Java 中的代码点转换为 utf-8 字节数组

java - 如何检测Java中的字符集编码?