perl输出 - 无法正确打印utf8文本文件

时间:2016-01-25 06:10:50

标签: perl unicode utf-8 character-encoding file-handling

所以我有utf8文本文件,我想读入,将行放入数组,并打印出来。但是输出不能正确打印符号,例如输出行如下所示:

  

“arnÅ¿teinhhörtgräflichen”

所以我尝试用一​​行测试脚本,直接粘贴到perl脚本中,而不从文件中读取它。那里的输出非常好。我检查了utf8 unicode文件。文件仍然必须导致输出问题(?)。

因为脚本太长了,我只是把它缩减到相关的: (转到目录,打开文件,将输入引导到函数& align,anaylse it,将其添加到数组,打印数组)

#!/usr/bin/perl -w
use strict;

use utf8;
binmode(STDIN,":utf8");
binmode(STDOUT,":utf8");
binmode(STDERR,":utf8");

#opens directory
#opens file from directory
 if (-d "$dir/$first"){
  opendir (UDIR, "$dir/$first") or die "could not open: $!";
  foreach my $t (readdir(UDIR)){
   next if $first eq ".";
   next if $first eq "..";

   open(GT,"$dir/$first/$t") or die "Could not open GT, $!";
   my $gt= <GT>;
   chomp $gt;

   #directly pasted lines in perl   - creates correct output
   &align("det man die Profeſſores der Philoſophie re- ");

    #lines from file    - output not correct
    #&align($gt);
    close GT;
    next;

  }closedir UDIR;
}

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

你告诉Perl你的源代码是UTF-8,STDIN,STDOUT和&amp; STDERR是UTF-8,但您没有说您正在阅读的文件包含UTF-8。

open(GT,"<:utf8", "$dir/$first/$t") or die "Could not open GT, $!";

如果不这样做,Perl会假定文件是用ISO-8859-1编码的,因为如果你没有指定不同的字符集,那就是Perl的默认字符集。它有助于将这些ISO-8859-1字符转码为UTF-8进行输出,因为您已经告诉它STDOUT使用UTF-8。由于文件实际上是UTF-8,而不是ISO-8859-1,因此输出不正确。