我有以下代码
use utf8; open($file, '>:encoding(UTF-8)', "さっちゃん.txt") or die $!; print $file "さっちゃん";
但是我把文件名称作为“.txt”
我想知道是否有一种方法,使我的工作(我有一个unicode文件名)这个工作,而不诉诸于Win32 :: API,Win32API :: *或移动到另一个平台,并使用Samba共享修改文件。
目的是确保我们没有任何需要加载的Win32特定模块(甚至是有条件的)。
Perl将文件名称视为不透明的字节串。 他们需要根据你的“locale”的编码进行编码(ANSI代码页)。
在Windows中,这通常是cp1252
。 它由GetACP
系统调用返回。 (预先“cp”)。 但是,cp1252不支持日文字符。
Windows还提供了一个“Unicode”又名“Wide”接口,但是Perl不能使用builtins *来访问它。 不过,您可以使用Win32API :: File的CreateFileW
。 IIRC,你仍然需要自己编码文件名。 如果是这样,你会使用UTF-16le
作为编码。
* – Perl对Windows的支持在某些方面很糟糕。
使用Encode :: Locale :
use utf8; use Encode::Locale; use Encode; open($file, '>:encoding(UTF-8)', encode(locale_fs => "さっちゃん.txt") ) or die $!; print $file "さっちゃん";
以下使用Activestate Perl在Windows 7上生成一个统一的文件名。
#----------------------------------------------------------------------- # Unicode file names on Windows using Perl # Philip R Brenan at gmail dot com, Appa Apps Ltd, 2013 #----------------------------------------------------------------------- use feature ":5.16"; use Data::Dump qw(dump); use Encode qw/encode decode/; use Win32API::File qw(:ALL); # Create a file with a unicode name my $e = "\x{05E7}\x{05EA}\x{05E7}\x{05D5}\x{05D5}\x{05D4}". "\x{002E}\x{0064}\x{0061}\x{0074}\x{0061}"; # File name in UTF-8 my $f = encode("UTF-16LE", $e); # Format supported by NTFS my $g = eval dump($f); # Remove UTF ness $g .= chr(0).chr(0); # 0 terminate string my $F = Win32API::File::CreateFileW ($g, GENERIC_WRITE, 0, [], OPEN_ALWAYS, 0, 0); # Create file via Win32API say $^E if $^E; # Write any error message # Write to the file OsFHandleOpen(FILE, $F, "w") or die "Cannot open file"; binmode FILE; print FILE "hello there\n"; close(FILE);