正如标题中所述,问题似乎是我从ASCII文件读取了一个字符串,另一个是utf8;当我使用插值形成一个字符串,然后将该字符串传递给open()时,它似乎得到了解决,我得到一个错误。这是一个最小的例子:
#!/usr/bin/perl
use open ":encoding(utf8)";
use strict;
open (FILE,"<u");
my $p = <FILE>;
$p =~ s/\s+$//;
close FILE;
print "p=",$p,"\n";
if ($p eq "cat") {print "yes\n"} else {"no\n"}
my $file = "påminnelser"; # note the circle over the "a"
my $x = "$p <$file |";
print "x=$x\n";
open (FILE, $x);
close FILE;
从外部文件u中读取字符串$ p似乎有所不同,如下所示:
cat
我的代码是utf8,而文件u是ASCII,根据'file'实用程序:
---- rintintin a $ file u
u: ASCII text
---- rintintin a $ file bug.pl
bug.pl: Perl script, UTF-8 Unicode text executable
结果如下:
---- rintintin a $ ./bug.pl
p=cat
yes
x=cat <påminnelser |
sh: 1: cannot open påminnelser: No such file
文件名已经在open()调用中的某个地方被释放。虽然$ p eq“cat”是真的,如果我只是在代码中设置$ p =“cat”而不是从文件中读取它,那么错误就会消失。我猜这是因为我的源代码文件是utf8。
有谁可以解释这里发生了什么以及如何解决它?
[编辑]正如我在Dmitri Chubarov的回答评论中所描述的,事实证明我的最小例子实际上没有正确地代表我原始程序中的错误。这个问题描述了实际的错误:Should perl's File::Glob always be post-filtered through utf8::decode?
答案 0 :(得分:3)
你应该添加
use utf8;
pragma到您的脚本,以便将Perl源文本解释为UTF8。
默认情况下,Perl源被解释为字节流,因此
my $file = "påminnelser"
变成一个字节字符串,根据默认编码进行解释。