1

如标题所述,问题似乎是我从 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:

---- 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 回答的评论中所述,事实证明,我的最小示例实际上并没有正确表示我原始程序中的错误。这个问题描述了实际的错误:Perl 的 File::Glob 是否总是通过 utf8::decode 进行后过滤?

4

1 回答 1

2

你应该添加

 use utf8;

为您的脚本添加编译指示,以便将 Perl 源文本解释为 UTF8。

默认情况下,Perl 源被解释为字节流,因此

 my $file = "påminnelser" 

被转换为根据默认编码解释的字节串。

于 2013-08-26T01:19:52.977 回答