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

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

所以我有 utf8 文本文件,我想读入该文件,将行放入数组中,然后打印出来。但输出无法正确打印符号,例如输出行如下所示:

"arnſtein gehört gräflichen "

所以我尝试通过一行测试脚本,直接粘贴到 perl 脚本中,而不从文件中读取它。那里的输出非常好。我检查了这些文件,它们都是 utf8 unicode 格式。这些文件仍然会导致输出问题(?)。

由于脚本太长,我只是将其缩减为相关内容: (进入目录,打开文件,将输入引导到函数 &align,分析它,将其添加到数组,打印数组)

#!/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;
}

有什么想法吗?

最佳答案

你告诉 Perl 你的源代码是 UTF-8,STDIN、STDOUT 和 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,因此您会得到不正确的输出。

关于perl 输出 - 无法正确打印 utf8 文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34986151/

相关文章:

mysql - 如何在不更改数据的情况下更改表编码?

c# - 使用 Windows 范围内的 Beta UTF-8 支持功能时在 Winforms 中调整 RTF 的错误

带有非打印字符的 MySQL 查询(从左到右标记)

perl - 如何多线程查看 Perl 中是否存在网页?

perl - 为什么只有其中一个告诉我 "Modification of a read-only value attempted"?

mysql - Perl DBD::mysql 从长文本字段中截取单词

python - Django:生产环境的编码问题

javascript - 强制在输入字段中显示来自 Unicode 的文本

vim - 在 Vim 与 Emacs 中编辑非 ASCII 文本

perl - 仅使用低优先级短路运算符警告无效上下文