我有一个文件位于 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/