使用utf8编码的Perl脚本,它可以打开编码为GB2312的文件名吗?

时间:2009-11-16 13:44:22

标签: perl encoding utf-8 filenames

我不是在谈论用utf-8或非utf-8编码和东西读取文件内容。这是关于文件名。通常我将Perl脚本保存为系统默认编码,在我的情况下为“GB2312”,我不会有任何文件打开问题。但是出于处理目的,我现在有一些以utf-8编码保存的Perl脚本文件。问题是:这些脚本无法打开名称由“GB2312”编码编码的字符组成的文件,我不喜欢重命名文件的想法。

有没有人碰巧有处理这种情况的经验?非常感谢您的任何指导。

修改

这是用于演示我的问题的最小化代码:

# I'm running ActivePerl 5.10.1 on Windows XP (Simplified Chinese version)
# The file system is NTFS

#!perl -w
use autodie;

my $file = "./测试.txt"; #the file name consists of two Chinese characters
open my $in,'<',"$file";

while (<$in>){
print;
}

如果以“ANSI”编码保存,则此测试脚本可以正常运行(我假设ANSI编码与用于显示中文字符的GB2312相同)。但如果保存为“UTF-8”则不起作用,错误信息如下:

Can't open './娴嬭瘯.txt' for reading: 'No such file or directory'.

在此警告消息中,“娴嬭瘯”是无意义的垃圾字符。

更新

我首先尝试将文件名编码为GB2312但它似乎不起作用:( 这是我试过的:

#!perl -w
use autodie;
use Encode;

my $file = "./测试.txt";
encode("gb2312", decode("utf-8", $file));
open my $in,'<',"$file";

while (<$in>){
print;
}

我目前的想法是:我的操作系统中的文件名是测试.txt,但编码为GB2312。在Perl脚本中,文件名与人眼看起来相同,仍然是测试.txt。但对于Perl来说,它们是不同的,因为它们具有不同的内部表示。但是我不明白为什么当我已经将Perl中的文件名转换为GB2312时问题仍然存在,如上面的代码所示。

更新

我做到了,终于做到了:)

@ brian的建议是对的。我在上面的代码中犯了一个错误。我没有将编码的文件名返回给$ file。

以下是解决方案:

#!perl -w
use autodie;
use Encode;

my $file = "./测试.txt";
$file = encode("gb2312", decode("utf-8", $file));
open my $in,'<',"$file";

while (<$in>){
print;
}

1 个答案:

答案 0 :(得分:6)

如果你

 use utf8;
在你的Perl脚本中,

只是告诉perl源是UTF-8。它不会影响perl如何处理外部世界。你是否打开任何其他Perl Unicode功能?

您是否遇到过每个文件名或其中一些文件的问题?你能给我们一些例子,或者一个小的演示脚本吗?我没有将名称编码为GB2312的文件系统,但您在调用open之前尝试将文件名编码为GB2312吗?

如果您想要使用特定编码编码的特定字符串,可以使用Encode模块。尝试使用您提供给open的文件名。