我有一个以UTF-16编码的文本文件。每行包含多个由制表符分隔的列。对于那些关心,该文件是从iTunes导出的播放列表TXT。列#27包含一个文件名。如何检查Perl中是否存在UTF-16文件名?
我使用类似的代码在Linux中使用Perl 5.8.8阅读它:
binmode STDIN, ":encoding(UTF-16)";
while(<>)
{
chomp;
my @cols = split /\t/, $_;
my $filename = $cols[26]; # Column #27 contains the filename
print "File exists!" if (-e "$filename");
}
(请注意:我已经缩短这个代码片断在我实际的代码中,我做了一些换人转换。绝对windows文件名由iTunes用于在我的Linux机器上有效的文件名)
即使文件存在,(-e)文件测试也不会返回true。我相信它与UTF-16中的字符串有关,但无法弄清楚问题所在。实际的文件名只使用ASCII字符。如果我打印$ filename变量,文件名打印正确。
Perl中的文件名可以使用UTF16吗?任何想法如何让这段代码片段工作?
在我花费任何时间之前,什么是'my $ filename =〜$ cols [26];'? – 2009-08-22 20:15:54
抱歉 - 错字。应该是=在StackOverflow错字,而不是我原来的代码。问题依然存在。 – blt04 2009-08-22 20:17:22
文件名本身不能是UTF-16,因为UTF-16填满了零字节。现在许多Linux发行版正在使用UTF-8,所以这将是第一个尝试的编码。 – bobince 2009-08-22 20:46:47