使用Perl从字符串中删除BOM

use*_*925 14 string perl text byte-order-mark utf-8

我有以下问题:我正在读取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?

谢谢!

ike*_*ami 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
Run Code Online (Sandbox Code Playgroud)

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

由于忘记:encoding在输出文件句柄上添加图层,因此您的角色很宽.以下内容添加:encoding(UTF-8)到STDIN,STDOUT,STDERR,并使其成为默认值open().

use open ':std', ':encoding(UTF-8)';
Run Code Online (Sandbox Code Playgroud)


Eug*_*e K 6

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

s/^\x{FEFF}//;
Run Code Online (Sandbox Code Playgroud)


Pie*_*rre 5

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

use File::BOM;

open_bom(my $fh, $path, ':utf8')
Run Code Online (Sandbox Code Playgroud)