Perl Win32::Clipboard GetFiles函数在Win11下无法正确处理日文文件名
解决Windows 11下Perl获取剪贴板日文文件名显示为问号的问题
问题重现
使用Win32::Clipboard的GetFiles()方法获取剪贴板中的日文文件名时,Windows 11环境下输出为C:?????.log,但Windows 10可正常显示C:\あいうえお.log。已确认:
- 系统安装日文字体,执行
dir c:命令能正常显示日文文件名 - 使用
$clipboard->GetText()复制日文文本可正常输出 - 单独编码STDOUT或直接处理
GetFiles()输出无效
解决方案
修改代码,对GetFiles()返回的字符串进行正确的编码转换:
#!/usr/bin/perl use strict; use utf8; use Win32::Clipboard; use Encode; use Win32; my $clipboard = Win32::Clipboard(); my @files = $clipboard->GetFiles(); # 设置STDOUT为控制台当前编码 my $console_cp = Win32::GetConsoleOutputCP(); binmode STDOUT, ":encoding($console_cp)"; foreach my $f (@files) { my $decoded_path; # 优先尝试UTF-16LE解码(Windows剪贴板Unicode格式) eval { $decoded_path = decode('UTF-16LE', $f, Encode::FB_CROAK); }; # 解码失败则使用系统默认ANSI编码(日文系统为CP932) if ($@) { $decoded_path = decode('cp932', $f); } print $decoded_path; }
原因说明
Windows 11对剪贴板文件路径的编码处理逻辑与Windows 10存在差异:
- Windows 10下
GetFiles()返回的是系统默认ANSI编码(日文系统为CP932)的字符串 - Windows 11下该方法返回的是UTF-16LE格式的Unicode字节串,直接打印未解码的字节串会导致非ASCII字符被替换为问号
通过先将原始字符串解码为Perl内部的UTF-8字符串,再编码为控制台支持的编码输出,即可正常显示日文文件名。
内容的提问来源于stack exchange,提问作者Shoichi Takasaki
相关产品推荐
相关产品推荐

