windows - 如何在 Perl 中编写 *filename* 包含 utf8 字符的文件?

标签 windows perl utf-8 filenames cmd

我正在努力创建一个包含非 ASCII 字符的文件。

如果使用 0 作为参数调用以下脚本,则它工作正常,但在使用 1 调用时终止。

错误信息是open: Invalid argument at C:\temp\filename.pl line 15。

脚本在 cmd.exe 中启动。

我希望它写入一个名称为(取决于参数)äöü.txtäöü☺.txt 的文件。但是我无法创建包含笑脸的文件名。

use warnings;
use strict;

use Encode 'encode';

#   Text is stored in utf8 within *this* file.
use utf8;

my $with_smiley = $ARGV[0];

my $filename = 'äöü' . 
  ($with_smiley ? '☺' : '' ).
   '.txt';

open (my $fh, '>', encode('cp1252', $filename)) or die "open: $!";

print $fh "Filename: $filename\n";

close $fh;

我可能遗漏了一些对其他人来说很明显的东西,但我找不到,所以我很感激任何解决这个问题的建议。

最佳答案

首先,说“UTF-8 字符”很奇怪。 UTF-8可以编码任何Unicode字符,所以UTF-8字符集就是Unicode字符集。这意味着您要创建名称包含 Unicode 字符的文件,更具体地说,是不在 cp1252 中的 Unicode 字符。

我已经 answered这在过去的 PerlMonks 上。答案复制如下。


Perl 将文件名视为不透明的字节串。这意味着文件名需要根据您的“区域设置”的编码(ANSI 代码页)进行编码。

在Windows中,通常使用代码页1252,因此编码通常为cp1252。 .* 但是,cp1252 不支持泰米尔语和印地语字符 [或“☺”]。

Windows 还提供了一个“Unicode”又名“Wide”接口(interface),但 Perl 不提供使用内置函数访问它**。您可以使用 Win32API::FileCreateFileW,不过。 IIRC,您仍然需要自己对文件名进行编码。如果是这样,您将使用 UTF-16le 作为编码。

前述Win32::Unicode似乎处理了一些使用 Win32API::File 的肮脏工作为你。我还建议从那开始。

* — 代码页由 GetACP 系统调用返回(作为数字)。前置 "cp"以获得编码。

** — Perl 对 Windows 的支持在某些方面很糟糕。

关于windows - 如何在 Perl 中编写 *filename* 包含 utf8 字符的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7205940/

相关文章:

android - 亚行没有启动

windows - 批量编码,然后将文件大小与原始文件大小进行比较并删除更大的文件

python - Perl 在获取 HTML 页面方面胜过 Python?

perl - 当设置 Perl 代码作为脚本或模块运行时,__PACKAGE__ 的原因是什么?

php - UTF-8贯穿始终

mySQL:索引表上的 utf8 字符集和重复键错误

c - 一个虚拟地址空间中的进程线程如何进行内存管理?

windows - 在 Windows 中是否有任何文件夹可以替代 ProgramData?

multithreading - 线程 perl 和信号处理程序

ubuntu - 无法在 Web 浏览器中显示 Unicode 字符?