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

Ren*_*ger 10 windows perl filenames cmd utf-8

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

以下脚本工作正常,如果使用0as参数调用但在调用时死亡1.

错误消息已打开:C:\ temp\filename.pl第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;
Run Code Online (Sandbox Code Playgroud)

我可能错过了一些对他人来说很明显的东西,但是我找不到,所以我很欣赏任何解决这个问题的指针.

ike*_*ami 12

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

我过去在PerlMonks上已经回答了这个问题.答案复制如下.


Perl将文件名视为不透明的字节字符串.这意味着文件名需要根据"语言环境"的编码(ANSI代码页)进行编码.

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

Windows还提供"Unicode"又称"宽"接口,但Perl不提供使用内置**的访问权限.您可以使用的Win32API ::文件CreateFileW,虽然.IIRC,你还需要自己编码文件名.如果是这样,您将UTF-16le用作编码.

前面提到的Win32 :: Unicode似乎处理了一些使用Win32API :: File的脏工作.我也建议从那开始.

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

** - Perl对Windows的支持在某些方面很糟糕.

  • @ikegami,Widows声称在某些领域符合POSIX标准,特别是文件系统和文件命名.http://technet.microsoft.com/en-us/library/cc976809.aspx (3认同)