Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Perl中使用BOM编码检测UTF8_Perl_File_Comparison - Fatal编程技术网

如何在Perl中使用BOM编码检测UTF8

如何在Perl中使用BOM编码检测UTF8,perl,file,comparison,Perl,File,Comparison,我有一个简单的Perl脚本,可以比较两个文件。 结果我使用UTF8 BOM编码写入不同的文件。 为了在BOM表文件中保存文本,我将chr(65279)打印到结果文件的开头。有时输入文本中已经包含BOM字符,我的脚本会再打印一个 问题是:我如何解决这一问题,避免打印此BOM字符两次 请参阅下面的Perl代码文本: use strict; use warnings; use List::Compare; use Cwd 'abs_path'; use open ':encoding(utf8)';

我有一个简单的Perl脚本,可以比较两个文件。 结果我使用UTF8 BOM编码写入不同的文件。 为了在BOM表文件中保存文本,我将chr(65279)打印到结果文件的开头。有时输入文本中已经包含BOM字符,我的脚本会再打印一个

问题是:我如何解决这一问题,避免打印此BOM字符两次

请参阅下面的Perl代码文本:

use strict;
use warnings;
use List::Compare;
use Cwd 'abs_path';
use open ':encoding(utf8)';
use open IO => ':encoding(utf8)';

open F, "<$ARGV[0]" or die $!;
open S, "<$ARGV[1]" or die $!;
my @a=<F>;
my @b=<S>;
close F;
close S;

my $lc = List::Compare->new(\@a, \@b);

my @intersection = $lc->get_intersection;
my @missing = $lc->get_unique;
my @extra = $lc->get_complement;

open EXTRA, ">".$ARGV[2]."file_extra.txt" or die("Unable to open the file");
open MISSING, ">".$ARGV[2]."file_missing.txt" or die("Unable to open the file");
open SUBTRACTED, ">".$ARGV[2]."file_subtr.txt" or die("Unable to open the file");

#Turn on UTF-8 BOM support
print EXTRA chr(65279);
print MISSING chr(65279);
print SUBTRACTED chr(65279);

print MISSING @missing;
print EXTRA @extra;
print SUBTRACTED @intersection;

close MISSING;
close EXTRA;
close SUBTRACTED;
使用严格;
使用警告;
使用列表::比较;
使用Cwd“abs_路径”;
使用open':编码(utf8)';
使用开放IO=>':编码(utf8)';
打开F“.”$ARGV[2]。“file_extra.txt”或die(“无法打开文件”);
打开丢失的“>”$ARGV[2]。“file_MISSING.txt”或死亡(“无法打开文件”);
打开减去“>”$ARGV[2]。“file_subtr.txt”或死亡(“无法打开文件”);
#启用UTF-8 BOM表支持
打印额外的chr(65279);
打印缺失的chr(65279);
打印减去的chr(65279);
打印缺失@缺失;
额外打印@额外;
在相交处打印减法;
近距离失踪;
额外关闭;
近减法;

在读取文件内容时将其剥离(在您的示例中,如果确实需要,请将
s/^\x{FEFF}/
应用于
$a[0]
$b[0]
),然后在打印
结果时将其添加到输出前面,但最好不要再打印回来,因为它对UTF-8毫无用处。

如果您有双BOM,这可能是因为一个BOM表来自您的输入。因此,您应该在处理输入之前清理输入:


$a[0],$b[0]

为什么不完全放弃BOM?对于UTF-8,它是完全可选的,因为UTF-8字节总是以相同的顺序写入,而不管平台的端号如何。我需要它将输出文本文件传递给另一个仅支持带BOM的UTF8的应用程序,如果我传递带有简单UTF8编码的文本文件,某些字符将被扭曲。