我在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));
它不起作用。有什么想法吗?
如果我不清楚,请原谅我。
亲切的问候, 迈克尔
答案 0 :(得分: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文件名的其他语言也有完全相同的问题。