perl - 如何检查 Perl 中是否存在 UTF-16 文件名?

标签 perl utf-16

我有一个用 UTF-16 编码的文本文件。每行包含许多由制表符分隔的列。对于那些关心的人,该文件是从 iTunes 导出的播放列表 TXT。第 27 列包含文件名。

我正在使用类似于以下代码的 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");
}

(请注意:我已经缩短了这段代码片段。在我的实际代码中,我做了一些替换以将 iTunes 使用的绝对 Windows 文件名转换为在我的 Linux 机器上有效的文件名)

即使文件存在,(-e) 文件测试也不会返回 true。我相信这与 UTF-16 中的字符串有关,但无法弄清楚问题是什么。实际文件名仅使用 ASCII 字符。如果我打印 $filename 变量,文件名会正确打印。

Perl 中的文件名可以是 UTF16 吗?任何想法如何让这个代码片段工作?

最佳答案

UTF-16 文本由 :encoding 层处理。当它进入$_ ,没有办法说它曾经是 UTF-16。我不认为那是你的问题。

我的猜测是您的文件名中有一些空格(您在尝试打印时没有注意到)或者您不在您认为的目录中。

尝试

if (-e $filename) { print "File exists!" } 
else { print "File <$filename> not found" }

并仔细检查文件名。您也可以 use Cwd;并打印出当前目录。

关于perl - 如何检查 Perl 中是否存在 UTF-16 文件名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1316929/

相关文章:

perl - 为什么我会收到错误 - "Cannot determine file type for '/tmp/test.war'”?

perl - 无法在 perl 中获取 CSV 格式的所需哈希

C:从 UTF-8 字符串确定 UTF-16 字符串需要多少字节的最有效方法

html - 在网络浏览器上显示 UTF-16 字符

c++ - 将字节数组从 utf-16 转换为 utf-8

javascript - 将所有不匹配的代理对替换为 JavaScript 字符串中的替换字符

javascript - 如何在 Vim 中启用自动折叠?

perl - 打印数组后不需要的空格。我正在使用 perl

perl - 为什么即使我已将 DBI 调用包装在 eval 中,我仍会在控制台上看到 DBI 错误?

用于在 UTF8 和 UTF16 偏移量之间转换的 Java 代码(Java 字符串偏移量与 Python 3 字符串偏移量之间的转换)