使用Perl从字符串中删除BOM

时间:2014-06-24 15:01:49

标签: string perl text utf-8 byte-order-mark

我有以下问题:我正在读取UTF-8文本文件(我告诉Perl我这样做是通过“:encoding(utf-8)”)。

该文件在十六进制查看器中如下所示: EF BB BF 43 6F 6E 66 65 72 65 6E 63 65

打印时会转换为“∩╗┐Conference”。我理解我被警告的“广角”是BOM。我想摆脱它(不是因为警告,而是因为它弄乱了我后来进行的字符串比较)。

所以我尝试使用以下代码将其删除,但我失败了:

$ line = ~s / ^ \ xEF \ xBB \ xBF //;

任何人都可以告诉我如何从读取UTF-8文件第一行获得的字符串中删除UTF-8 BOM吗?

谢谢!

4 个答案:

答案 0 :(得分:15)

EF BB BF是BOM的UTF-8编码,但您对其进行了解码,因此您必须查找其已解码的表单。 BOM是在文件开头使用的零宽度无间隔空格(U + FEFF),因此以下任何一种都可以:

s/^\x{FEFF}//;
s/^\N{U+FEFF}//;
s/^\N{ZERO WIDTH NO-BREAK SPACE}//;
s/^\N{BOM}//;   # Convenient alias

  

我理解"广泛的角色"我被警告的是BOM。我想摆脱它

您因为忘记在输出文件句柄上添加:encoding图层而获得广泛的字符。以下内容将:encoding(UTF-8)添加到STDIN,STDOUT,STDERR,并使其成为open()的默认值。

use open ':std', ':encoding(UTF-8)';

答案 1 :(得分:6)

要化解BOM,您必须知道它不是3个字符,它是UTF(U + FEFF)中的1:

s/^\x{FEFF}//;

答案 2 :(得分:3)

如果您使用File::BOM打开文件,它将为您删除BOM。

use File::BOM;

open_bom(my $fh, $path, ':utf8')

答案 3 :(得分:0)

理想情况下,您的文件句柄应该自动为您执行此操作。但如果你不是在理想的情况下,这对我有用:

use Encode;

my $value = decode('UTF-8', $originalvalue);
$value =~ s/\N{U+FEFF}//;