如何在 Windows 上的 Perl 中将具有 UTF-8 文件名的文件复制到另一个 UTF-8 文件名?

2024-01-02

例如,给定一个空文件テスト.txt,我该如何制作一个名为テスト.txt.copy?

我第一次破解它设法访问该文件并创建新文件名,但生成的副本テスト.txt.copy.

这是我的第一次尝试:

#!/usr/bin/env perl

use strict;
use warnings;

use English '-no_match_vars';
use File::Basename;
use Getopt::Long;

use File::Copy;
use Win32;

my (
    $output_relfilepath,
   ) = process_command_line();

open my $fh, '>', $output_relfilepath or die $!;
binmode $fh, ':utf8';
foreach my $short_basename ( glob( '*.txt') ) {

  # skip the output basename if it's in the glob
  if ( $short_basename eq $output_relfilepath ) {
    next;
  }

  my $long_basename = Win32::GetLongPathName( $short_basename );
  my $new_basename  = $long_basename . '.copy';

  print {$fh} sprintf(
                      "short_basename = (%s)\n" .
                      " long_basename = (%s)\n" .
                      "  new_basename = (%s)\n",
                      $short_basename,
                      $long_basename,
                      $new_basename,
                     );
  copy( $short_basename, $new_basename );
}

printf(
       "\n%s done! (%d seconds elapsed)\n",
       basename( $0 ),
       time() - $BASETIME,
      );

# === subroutines ===

sub process_command_line {

  # default arguments
  my %args
    = (
       output_relfilepath => 'output.txt',
      );

  GetOptions(
             'help'                 => sub { print usage(); exit },
             'output_relfilepath=s' => \$args{output_relfilepath},
            );

  return (
          $args{output_relfilepath},
         );
}

sub usage {
  my $script_name = basename $0;

  my $usage = <<END_USAGE;
======================================================================

Test script to copy files with a UTF-8 filenames to files with
different UTF-8 filenames.  This example tries to make copies of all
.txt files with versions that end in .txt.copy.

  usage: ${script_name} (<options>)

options:

  -output_relfilepath <s>   set the output relative file path to <s>.
                            this file contains the short, long, and
                            new basenames.
                            (default: 'output.txt')

----------------------------------------------------------------------

examples:

  ${script_name}

======================================================================
END_USAGE

  return $usage;
}

以下是内容output.txt执行后:

short_basename = (BD9A~1.TXT)
 long_basename = (テスト.txt)
  new_basename = (テスト.txt.copy)

我尝试过更换文件::复制 http://perldoc.perl.org/File/Copy.html的复制命令与系统调用:

my $cmd = "copy \"${short_basename}\" \"${new_basename}\"";
print `$cmd`;

并使用 Win32::CopyFile:

Win32::CopyFile( $short_basename, $new_basename, 'true' );

不幸的是,在这两种情况下我得到了相同的结果(テスト.txt.copy)。对于系统调用,打印显示1 file(s) copied.正如预期的那样。

Notes:

  • 我正在运行 Perl 5.10.0草莓 Perl http://strawberryperl.com/在 Windows 7 专业版上
  • 我用Win32 http://search.cpan.org/~jdb/Win32-0.39/Win32.pm访问长文件名的模块
  • glob 返回短文件名,我必须使用它来访问文件
  • テsuto = 测试 (tesuto) inkatakana http://en.wikipedia.org/wiki/Katakana
  • 我读了佩鲁尼图特 http://perldoc.perl.org/perlunitut.html and 每个软件开发人员绝对必须了解 Unicode 和字符集的绝对最低限度(没有任何借口!) http://joelonsoftware.com/articles/Unicode.html

这应该可以通过复制文件W http://search.cpan.org/perldoc?Win32API::File#CopyFileW函数来自Win32API::文件 http://search.cpan.org/perldoc?Win32API::File,应该包含在草莓中。我自己从来没有弄乱过 Unicode 文件名,所以我不确定细节。您可能需要使用Encode http://search.cpan.org/perldoc?Encode手动将文件名转换为 UTF-16LE (encode('UTF16-LE', $filename)).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Windows 上的 Perl 中将具有 UTF-8 文件名的文件复制到另一个 UTF-8 文件名? 的相关文章

  • Perl 正则表达式图灵完备吗?

    我见过 Ruby 和 Perl 程序员做了一些事情复杂的代码挑战 https codegolf stackexchange com questions 3596 regex validating regex完全用正则表达式 这前瞻和后瞻 h
  • 使用 Cygwin 安装 CPAN GD 模块失败

    我已经尝试解决为什么 CPAN GD 模块无法使用 Cygwin 安装 2 天了 任何帮助深表感谢 谢谢 cpan install GD Going to read home xxxxxxxxxx cpan Metadata Databas
  • Perl LWP GET 或 POST 到 SNI SSL URL

    我有一个使用 perl LWP 向客户发送数据的系统 他们可以选择 URL 以及是 POST 还是 GET 一位新客户最近抱怨该服务不起作用 他们怀疑这是因为他们的端点使用了 SNI SSL 查看日志 我看到的只是错误消息 证书验证失败 5
  • 如何在 Perl 中循环访问类的所有方法?

    如何在 Perl 中循环访问一个类的所有方法 有没有关于 Perl 内省或反射的好的在线参考 Todd Gardner 使用 Moose 的建议很好 但他选择的示例代码并不是很有帮助 如果你正在检查一个非 Moose 使用类 你会这样做 u
  • 按值和键对哈希进行排序(按顺序)

    我正在寻找一种很好的方法来在 Perl 中先按值排序 然后再按键排序 Example my userids williams gt Marketing smith gt Research johnson gt Research jones
  • 使用 Visual Studio Code 调试 Perl

    我今天刚开始使用 Perl 并安装了活动Perl https en wikipedia org wiki ActivePerl5 24 1 一切都很顺利 我能够创建我的测试程序testPerl pl与简单的print命令并运行它consol
  • StrRev() 不支持 UTF-8 [重复]

    这个问题在这里已经有答案了 我正在尝试编写一个代码来替换非阿拉伯支持的程序中支持的阿拉伯文本因为我需要在替换后反转文本 但它显示一些垃圾内容而不是想要的结果 这是代码 结果 After Reverse 我需要它是原来的样子 但相反 不是垃圾
  • 何时计划 (SELECT) 查询?

    在 PostgreSQL 中 什么时候计划 SELECT 查询 Is it 在报表准备时 或者 在处理 SELECT 开始时 或者 别的东西 我问的原因是 Stackoverflow 上有一个问题 相同的查询 两种不同的方式 性能截然不同
  • perl 和 java 正则表达式功能之间有什么区别?

    perl 和 java 在支持哪些正则表达式术语方面有什么区别 这个问题仅涉及正则表达式 并且特别排除了how可以使用正则表达式 即使用正则表达式的可用函数 方法 以及语言之间的语法差异 例如java要求转义反斜杠等 特别令人感兴趣的是 j
  • Perl 脚本的 shebang 行应该使用什么?

    哪一个用作 Perl 脚本的 shebang 行更好或更快 perl perl exe fullpath perl perl exe partialpath perl perl exe 并且 当使用 perl 当它在特定系统上运行时 我如何
  • Perl 脚本中“不在某个 shell 下运行”是什么意思?

    在许多 Perl 脚本中 特别是在著名的 CPAN 发行版中 我发现以下代码 eval exec usr bin perl w S 0 1 if 0 not running under some shell 我想知道它是做什么用的 Than
  • 从函数返回哈希值的最佳 Perl 实践是什么?

    我正在考虑将哈希引用传递给函数或从函数返回数据的最佳实践 一方面 仅将输入值传递给函数并仅返回输出变量似乎很直观 然而 在 Perl 中传递哈希值只能通过引用来完成 因此有点混乱 而且似乎更有可能犯错误 另一种方法是在输入变量中传递引用 但
  • APEX动态定义默认文件名?

    在 APEX 应用程序中 我有一个交互式报告 In Report Attributes gt Report Export gt Filename 您可以指定下载的默认文件名 问题 有没有办法动态定义这个默认文件名 是的 我知道 用户在下载时
  • 如何检测FTP文件传输完成?

    我正在编写一个脚本 用于轮询 FTP 站点上的文件并在可用时将它们下载到本地 文件由各个来源方随机存放到 FTP 站点 我需要一种方法能够在下载之前检测 FTP 站点上的文件是否已被源方完全传输 关于如何解决这个问题有什么想法吗 如果您可以
  • 为什么 MySQL 将 é 与 e 视为相同?

    我使用 Django Web 应用程序将 Unicode 字符串存储在 MySQL 数据库中 我可以很好地存储 Unicode 数据 但是在查询时 我发现 and e被视为好像它们是同一个角色 In 1 User objects filte
  • .properties 或 JSP 编码有问题

    我有jsp文件
  • Windows 上的 git 忽略文件名大小写更改 [重复]

    这个问题在这里已经有答案了 我有一个reactjs应用程序 我正在将所有文件名标准化为小写以符合Nodejs 最佳实践 https devcenter heroku com articles node best practices stic
  • SQLite 的不区分大小写的 UTF-8 字符串排序规则 (C/C++)

    我正在寻找一种方法 以不区分大小写的方式对 C 中的 UTF 8 字符串进行比较和排序 以便在SQLite 中的自定义排序规则函数 http www sqlite org c3ref create collation html 该方法应该i
  • Perl:管理 Windows 上的路径编码

    我正在努力处理包含非英文字符的路径 Activestate Perl Windows XP 如何打开 写入 复制等位于包含希腊语 俄语 法语重音字符的路径中的文件 假设我要将 text txt 文件复制到的目录是 C Documents a
  • 使用perl创建层次结构文件

    我的任务是使用 perl 创建父子层次结构文件 示例输入文件 制表符分隔 记录将以随机顺序排列在文件中 父项 可能出现在 子项 之后 S5 S3 S5 S8 ROOT S1 S1 S7 S2 S5 S3 S4 S1 S2 S4 77 S2

随机推荐

  • MATLAB 环境调整 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 您如何调整 MATLAB 环境以更好地满足您的需求 每个答案进行一次调整 我运行 格式紧凑 来删除所有那些令人沮丧的空白行 这些空白行
  • 无法加载文件或程序集“System.IdentityModel,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089”或其依赖项之一

    我是 mvc 新手 我刚刚安装了 Visual studio 15 当我创建一个 mvc 项目并运行它时 无需任何修改 它给了我上述错误 我在另一台电脑上做了同样的事情 它可以工作 但在我的系统上它给了我错误 搜索解决方案但找不到任何具体的
  • 对移动日期选择器的任何建议[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • jQuery Ui:无法从 Div 中拖动元素并溢出

    我在 div 中有一个简单的 UL 并将溢出设置为自动和固定高度 每个 LI 都可以通过 jQuery 拖动 问题是我无法将它们从 div 中拖动 当拖动到边界时它们会消失 我已经查看了这个问题及其答案 但这里的解决方案似乎对我不起作用 设
  • 扩展接口以包含日期类型

    我需要扩展 Typescript 中的接口以包含日期类型 我尝试过以下方法 interface WithDate key string Date 但当我尝试延长WithDate 我收到错误 interface Person extends
  • 修改 std::set 中的元素

    我有以下代码 int main set
  • 过滤特定行

    我目前正在尝试从日志文件中过滤特定行 我在日志文件中的行具有以下模式 8 05 13 14 24 55 468 RuntimeErrorI E LaError 8 05 13 14 24 55 468 AbcdEfg W SomeWarni
  • 使用 django 为一个模型的属性使用多个输入字段

    In models py I have class myModel period models CharField max length 100 blank True the period应该包含类似的内容 DD HH MM SS 在 HT
  • SetWindowPos 返回拒绝访问

    我正在构建可帮助拍摄所选窗口的屏幕截图的应用程序 我在选定的窗口上显示半透明表单 在本例中我使用的是 winapi DllImport user32 dll SetLastError true public static extern bo
  • 是否有可能在 WPF / Touch 应用程序中弹出一个忽略 MenuDropAlignment 的窗口?

    作为一点背景知识 Windows 有一个针对触摸 平板电脑的功能 它可以根据您的 用手习惯 来移动弹出窗口 菜单的位置 以防止菜单出现在您的手下 从本质上讲 如果您设置为 右手 连接触摸设备后似乎默认为右手 您打开的每个弹出窗口都会被人为地
  • javascript 中用于文件路径验证的正则表达式

    我似乎找不到可以测试以下情况的 JavaScript 正则表达式 c temp D 目录名 testing john desktop tempdir 你可以看到我要做什么 我只需要它来验证文件路径 但我发现的所有表达式似乎都不适用于 Jav
  • 保护对 Kafka Connect REST API 的访问

    Kafka Connect 的 REST API 不安全且未经过身份验证 由于它未经身份验证 因此任何人都可以轻松访问连接器或任务的配置 由于这些配置可能包含如何访问源系统 在 SourceConnector 的情况下 和目标系统 在 Si
  • Windows 中哪个进程是用户特定的?

    我想知道 Windows 中的哪个进程是特定于用户的 我的意思是它是为每个用户登录创建的 我尝试了 explorer exe 但是当您切换用户并登录新帐户时 它会在我的代码中显示旧的登录名 基本上我只需要记录在应用程序中登录的用户 如果您需
  • 在 Outlook 2016 中添加上下文菜单项

    在 Outlook 2007 中 当用户右键单击邮件项目时 以下代码将菜单项添加到上下文菜单中 然而在 Outlook 2016 中这不起作用 这段代码根本没有被执行 Sub Application ItemContextMenuDispl
  • Android,我看到堆在增长,但我希望它停止

    我看到我的堆不断增长 并且我知道它最终会在任何设备上崩溃 因为它一直在增长 Grow heap frag case 在整个日志中都可以看到 在我的手机上 当使用 32mb 时 应用程序就会崩溃 其他手机当然是 16mb 如果有那么少的资源运
  • 单击按钮即可更新 asp.net 表

    我是 ASP NET 的新手 遇到了一个非常愚蠢的问题 但我无法弄清楚 我有一个表单 由 page load 上的数据库数据填充 用户更新表单的输入文本并单击 更新 按钮 它会更新 但会使用旧数据进行更新 为什么要用旧数据更新它 这是asp
  • 轨道 HAML 表格

    我目前正在尝试将 ERB 布局转换为 HAML 这是我不断收到的错误 index html haml 18 syntax error unexpected n hamlout format 这是 HAML 页面 row fluid span
  • 如何配置log4j只保留最近7天的日志文件?

    我在使用多个 Java 应用程序时遇到以下日志记录问题log4j用于记录 我希望日志文件每天轮换 例如 log 2010 09 10 log 2010 09 09 log 2010 09 08 log 2010 09 07 log 2010
  • 将单元测试添加到遗留代码[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 您是否曾经在事后向遗留代码中添加过单元测试 代码有多复杂 存根和模拟所有内容有多困难 最终的结果值得吗 我发现最好的方法是逐步添加单元测试 而不
  • 如何在 Windows 上的 Perl 中将具有 UTF-8 文件名的文件复制到另一个 UTF-8 文件名?

    例如 给定一个空文件 txt 我该如何制作一个名为 txt copy 我第一次破解它设法访问该文件并创建新文件名 但生成的副本 txt copy 这是我的第一次尝试 usr bin env perl use strict use warni