You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 00:05:20