使用utf8插入ASCII会在open()中出错

时间:2013-08-26 01:05:08

标签: string perl utf-8 character-encoding internationalization

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

1 个答案:

答案 0 :(得分:3)

你应该添加

 use utf8;

pragma到您的脚本,以便将Perl源文本解释为UTF8。

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

 my $file = "påminnelser" 

变成一个字节字符串,根据默认编码进行解释。