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的支持在某些方面很糟糕.
| 归档时间: |
|
| 查看次数: |
4100 次 |
| 最近记录: |