在 Perl/Tk 应用程序中,我想将具有任意 unicode 文件名的文件拖放到小部件上。
有一个 DropSite 工作示例: perl tk 从 Windows 资源管理器拖放文件夹 但它不适用于包含 unicode 字符的文件名,例如西里尔文与德语混合。特殊字符(不在本地代码页上)被接收为“?”。
有人有解决办法吗?
Ikegami 提到的 Microsoft 帮助页面,如何更改 Windows 代码页还展示了如何更改所有 Windows 的代码页(不仅仅是每个应用程序):
转至 Windows 设置 > 时间和语言 > 语言和区域 > 管理语言设置 > 更改系统区域设置,然后选中 Beta:使用 Unicode UTF-8 获得全球语言支持。然后重新启动电脑以使更改生效。
我这样做了,它对我来说效果很好,也解决了 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