Perl/Tk Dropsite:拖动具有任意Unicode名称的Windows文件

piztneat  于 8个月前  发布在  Perl
关注(0)|答案(1)|浏览(68)

在Perl/Tk应用程序中,我想将具有任意Unicode文件名的文件拖放到小部件上。
有一个工作的DropSite示例:perl tk drag & drop folder from windows explorer,但它不适用于包含Unicode字符的文件名,例如西里尔字母与德语混合。特殊字符(不在本地代码页上)被接收为“?"。
有人有解决办法吗?

ikfrs5lh

ikfrs5lh1#

池上提到的微软帮助页面,如何change the Windows code page,也展示了如何更改所有Windows的代码页(不仅仅是每个应用程序):
进入Windows设置>时间和语言>语言和地区>管理语言设置>更改系统区域设置,并选中Beta:使用Unicode UTF-8以获得全球语言支持。然后重新启动PC以使更改生效。
我这样做了,它对我很好,也解决了DropSite的问题。(但你需要将接收到的字符串解码为utf8。)
因此,上述工作脚本的修改版本将是:

use strict;
use warnings;
use Tk;
use Tk::DropSite;
use Encode;

my $textVariable = "drag here";

my $mw = MainWindow->new;

my $frame = $mw->Frame(
)->pack(-side => 'top', -expand => 1, -fill => 'x');

$frame->Label(
    -text => "My Label",
    -anchor => 'w',
    -width => 10,
)->pack(-ipady => 1, -side => 'left');

my $entry = $frame->Entry(
    -textvariable => \$textVariable,
    -width => 40,
)->pack(-side => 'left');

$frame->DropSite(
    -dropcommand => [\&AcceptDrop, $frame],
    -droptypes => ('Win32'),
);

$mw->MainLoop;

sub AcceptDrop {
    my ($widget, $selection) = @_;
    my $filename;

    $filename = decode_utf8 $widget->SelectionGet(
        -selection => $selection, 
        'STRING'
    );
    $textVariable = $filename;
} # /AcceptDrop

相关问题