我在使用Perl和Windows时遇到了编码问题。在运行Perl(草莓5.16)的Windows 7上,我需要打开文件和/或访问名称/路径中含有非英文字母的目录。对于打开文件,我已经找到了一个解决方案,似乎可以正常工作:
#!/usr/bin/perl -w
use strict;
use warnings;
use Win32::Unicode::File;
use Encode;
use Tk;
my $mw = Tk::MainWindow->new;
my $tissue_but = $mw->Button(
-text => 'Open file',
-command => [ \&select_unicode_file ],
);
$tissue_but->grid( -row => 3, -column => 1 );
Tk::MainLoop();
sub select_unicode_file{
my $types = [ ['Txt', '.txt'],
['All Files', '*'],];
my $input_file= $mw->getOpenFile(-filetypes => $types);
my $fh = Win32::Unicode::File->new;
if ($fh->open('<', $input_file)){
while (my $line = $fh->readline()){
print "\n$line\n";
}
close $fh;
}
else{
print "Couldn't open file: $!\n";
}
}
这段代码可以正确打开诸如“Поиск/Поиск.txt”这样的文件。
但我无法简单地获取目录路径并进行处理。我认为应该使用Win32::Unicode::Dir,但我真的无法理解文档。
大概应该是这样:
#!/usr/bin/perl -w
use strict;
use warnings;
use Win32::Unicode::Dir;
use Encode;
use Tk;
my $mw = Tk::MainWindow->new;
my $tissue_but = $mw->Button(
-text => 'Open file',
-command => [ \&select_unicode_directory ],
);
$tissue_but->grid( -row => 3, -column => 1 );
Tk::MainLoop();
sub select_unicode_directory{
my $dir = $mw->chooseDirectory( );
my $wdir = Win32::Unicode::Dir->new;
my $dir = $wdir->open($dir) || die $wdir->error;
my $dir_complete = "$dir/a.txt";
open (MYFILE, $dir_complete );
while (<MYFILE>) {
chomp;
print "$_\n";
}
close (MYFILE);
}
open
接受字节。使用 Win32API::File 的CreateFileW
打开文件。如果我没记错的话,你需要先通过encode('UTF-16le', "$qfn\0")
进行转换。 - ikegami