Perl 如何检查unicode文件名是否存在?

Perl 如何检查unicode文件名是否存在?,perl,unicode,filenames,solaris,Perl,Unicode,Filenames,Solaris,根据,-e不适用于unicode文件名,因此如何检查unicode文件名的存在?在Solaris系统上。在unix系统上,文件名只是字节序列。您必须向-e传递与实际文件名相同的字节序列。很有可能就是这些字节的UTF-8编码的文本。因此,如果您有Unicode代码点(“解码文本”),请尝试以下操作: utf8::encode( my $fn = $decoded_text ); say -e $fn ? "exists" : "doesn't exist"; 如果需要,不要忘记在目录名前加前缀。

根据,
-e
不适用于unicode文件名,因此如何检查unicode文件名的存在?在Solaris系统上。

在unix系统上,文件名只是字节序列。您必须向
-e
传递与实际文件名相同的字节序列。很有可能就是这些字节的UTF-8编码的文本。因此,如果您有Unicode代码点(“解码文本”),请尝试以下操作:

utf8::encode( my $fn = $decoded_text );
say -e $fn ? "exists" : "doesn't exist";

如果需要,不要忘记在目录名前加前缀。

“Unix”可能不够具体;哪个unix?什么文件系统?你到底看到了什么,说-e不起作用?点击我提供的链接,它会告诉你。这是Solaris。我认为你读得不对;它只是列出了unicode可能无法移植的地方。也就是说,你试过了吗?它在linux 4.13/ext4上运行良好。尝试
$fn=“s\xf4l\xe2r\xees”;打开$fh,“>”,$fn
并查看是否创建了一个文件
sôl–rîs
。如果不起作用,试着做
utf8::encode($fn)第一个。然后尝试
-e$fn
使用和不使用utf8::encode。谢谢。我计算出Unix文件系统上的文件名在
cp1252
中,所以这样做就可以工作了
$filename=encode(“cp1252”,decode(“utf-8”),decode”($filename))
@CJ7我计算出Unix文件系统上的文件名在
cp1252
-如果这是真的,我会感到惊讶
cp1252
是一种Microsoft编码,用于旧版Windows系统。我打赌你看到的是
ISO-8859-1
,但你没有遇到任何区别于
cp1252
的代码点。文件名在任何其他操作系统上都不是字节序列吗?另外,如果文件名是一个字节序列,那么unix系统在解码它们时是否有问题,或者任何修改文件名的程序在更改文件名时都必须使用系统指定的编码?您可以发布一个链接到文档,以更详细地说明这一点吗?@user1541776,在unix中,任何以NUL结尾的字节序列都是有效的路径。在Windows中,它们是编码文本,编码为UTF-16le或机器的“ANSI”编码,具体取决于使用的API。语义(允许哪些字符)与解码版本相关联,而不是它们的编码方式。@ikegami对此表示感谢。我发现Unix文件系统上的文件名在
cp1252
中,因此这样做可以使它工作
$filename=encode(“cp1252”,decode(“utf-8”,$filename))
。很可能是iso-8859-1,而不是Windows特定的编码。我相信你犯了那个错误。