【问题标题】:How to read text file contents without loss of characters in perl如何在 perl 中读取文本文件内容而不丢失字符
【发布时间】:2014-06-05 05:58:42
【问题描述】:

我在文本文件 (.txt) 中有以下文本:

Feste begründen die Identität einer Gemeinschaft und ihr Selbstverständnis nach innen。 Eng damit verbunden sind Emotionen, die zunächst im Zusammenhang mit einer gefühlten Zugehörigkeit zu einer Fest-Gemeinschaft zu verstehen sind。 Mit jedem Fest verbindet sich aber auch eine evidenced Überschreitung des Alltags: Der bestimmende festliche Eindruck die feierliche Gestimmtheit ist der einer erhöhten Bedeutungshaftigkeit des Lebens, durch die sich das Festliche aus dem Lauf des Alltagslebens hervorhebt und dessen Wirkmächtigkeit zuvörderst anhand der Analyze des bürgerlichen Geburtstages sinnfällig 演示 werden soll。

当我从 .txt 文件中读取此文本时,我得到的文本如下所示:

Feste begründen die Identität einer Gemeinschaft und ihr Selbstverständnis nach innen。 Eng damit verbunden sind Emotionen, die zunächst im Zusammenhang mit einer gefühlten Zugehörigkeit zu einer Fest-Gemeinschaft zu verstehen sind。 Mit jedem Fest verbindet sich aber auch eine evidenced Überschreitung des Alltags: Der bestimmende festliche Eindruck die feierliche Gestimmtheit ist der einer erhöhten Bedeutungshaftigkeit des Lebens, durch die sich das Festliche aus dem Lauf des Alltagslebens hervorhebt und dessen Wirkmächtigkeit zuvörderst anhand der Analyze des bürgerlichen Geburtstages sinnfällig 演示 werden soll。

您可以看到上述文本中不存在短划线,但我想要 (.txt) 文件中的确切文本,我也使用了 UTF-8,但仍然没有短划线。

我正在寻找您在 Perl 中解决此问题的想法。

【问题讨论】:

  • 没有足够的信息来提供有意义的答案。你的输入文件的编码是什么?您如何从输入文件中读取数据?您如何解码从输入文件中读取的数据。您想要在输出文件中使用什么编码?您如何将数据写入输出文件?您如何对写入输出文件的数据进行编码。基本上,我们需要查看更多您的代码。

标签: perl text file-io unicode utf-8


【解决方案1】:

试着像这样开始你的脚本:

#!/usr/bin/perl -CS

use open IO => ':utf8';

然后正常打开、读取和输出,该编译指示将指示 Perl 对所有输入和输出使用 UTF8 编码,并且选项 -CS 将打开对 STDINSTDOUTSTDERR 的 Unicode 支持.

您需要通过以下方式之一运行您的脚本:

  1. 给它添加执行权限,并使用./script.pl来运行它,或者
  2. 使用perl -CS /path/to/script.pl

参考:
perlrun
open
use utf8 gives me 'Wide character in print'


此脚本应该能够创建this file 的精确副本(通过diff 检查)。运行时${^UNICODE}的值应该是7,它会将这个变量的值打印到STDERR

#!/usr/bin/perl -CS

use strict;
use warnings;

use open IO => ':utf8';

use feature qw(switch say);

print STDERR "\${^UNICODE} = ${^UNICODE}\n";

use Data::Dumper;

open my $fh, '<', $ARGV[0] or die "Cannot open $ARGV[0]: $!";

while (<$fh>) {
    print;
}

【讨论】:

  • 感谢李先生,我使用了上面的行,但我仍然得到与没有 en-dash 相同的输出,我也尝试了 #binmode STDOUT, ":utf8";但没有奏效!但是感谢您的回复,如果您有任何其他想法,请发表评论
  • @user3354853 请确保您的输入文件使用 UTF8 编码。
  • 我试过之后李先生一定会回复你的,非常感谢
  • Mr.Lee 我尝试使用输入文件作为 UTF8 但还是同样的错误!
  • “那个 pragma 将指示 Perl 对所有输入和输出使用 UTF8 编码” - 实际上不,那个 pragma 只会影响输出。要同时影响输入和输出,您需要use open IO =&gt; ':utf8'。但这假设输入和输出都是 UTF-8。我们不知道这个问题。
【解决方案2】:

Perl 处理元音变音但不处理破折号这一事实表明该文件使用windows-1252 编码。 Perl 可能假设文件位于latin-1 (ISO-8859-1) 中,这是一种不使用809F 之间的代码点的编码。 windows-1252 中的 N 破折号为 97 可以解释为什么 Perl 不处理它。

尝试告诉 Perl 对文件和终端都使用windows-1252,使用the open pragma

use open qw( :encoding(windows-1252) :std );

【讨论】:

    猜你喜欢
    • 2013-07-24
    • 1970-01-01
    • 2021-05-20
    • 1970-01-01
    • 1970-01-01
    • 2018-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多