我正在努力创建一个包含非 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::File的 CreateFileW
,不过。 IIRC,您仍然需要自己对文件名进行编码。如果是这样,您将使用 UTF-16le
作为编码。
前述Win32::Unicode似乎处理了一些使用 Win32API::File 的肮脏工作为你。我还建议从那开始。
* — 代码页由 GetACP
系统调用返回(作为数字)。前置 "cp
"以获得编码。
** — Perl 对 Windows 的支持在某些方面很糟糕。
关于windows - 如何在 Perl 中编写 *filename* 包含 utf8 字符的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7205940/