当前位置: 首页 > 知识库问答 >
问题:

使用Perl从字符串中删除BOM

周作人
2023-03-14

我有以下问题:我正在从一个UTF-8文本文件中读取(我告诉Perl,我是通过“:编码(utf-8)”)。

该文件在十六进制查看器中看起来像这样:EF BB BF 43 6F 6E 66 65 72 65 6E 63 65

印刷时翻译成“∩会议”。我知道我被警告的“宽字符”是物料清单。我想摆脱它(不是因为警告,而是因为它搞砸了我稍后进行的字符串比较)。

因此,我尝试使用以下代码删除它,但失败惨重:

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

有人能告诉我如何从我通过阅读UTF-8文件的第一行获得的字符串中删除UTF-8 BOM吗?

谢谢

共有3个答案

易星宇
2023-03-14

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

use File::BOM;

open_bom(my $fh, $path, ':utf8')
蒋星雨
2023-03-14

要拆除BOM,你必须知道它不是3个字符,而是1个UTF(U FEFF):

s/^\x{FEFF}//;
邹德泽
2023-03-14

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

我知道我被警告的“宽字符”是物料清单。我想摆脱它

因为忘记在输出文件句柄上添加:编码层,所以字符变宽了。下面添加了:编码(UTF-8)到STDIN,STDOUT,STDERR,并使其成为open()的默认值。

use open ':std', ':encoding(UTF-8)';
 类似资料:
  • 问题内容: 例如,有一个字符串。。 如何从中删除中间字符M?我不需要代码。我想知道: Python中的字符串是否以任何特殊字符结尾? 哪种更好的方法-从中间字符或创建新字符串开始,将所有内容从右移到左,而不是复制中间字符? 问题答案: 在Python中,字符串是不可变的,因此你必须创建一个新字符串。你有一些关于如何创建新字符串的选项。如果要删除出现的,请执行以下操作: 如果要删除中心字符: 你询问

  • 问题内容: 我使用的框架会不时返回格式错误的字符串,其中包含“空”字符。 例如,“ foobar”表示为:[,f,o,o,b,a,r] 第一个字符不是空格(’‘),因此System.out.printlin()将返回“ foobar”而不是“ foobar”。但是,String的长度是7,而不是6。显然,这使大多数String方法(等于,拆分,子字符串等)变得无用。有没有办法从字符串中删除空字符?

  • 问题内容: 我有一个存储在数据库中的HTML字符串。不幸的是,它包含诸如®的字符,我想在数据库本身中或在我的Python / Django代码中使用“查找替换”将它们替换为HTML等效字符。 关于如何执行此操作的任何建议? 问题答案: 你可以使用ASCII字符为前128个字符,因此获取每个字符的编号,如果超出范围则将其删除 结果 请注意,@其中包括了它,因为毕竟它是一个ASCII字符。如果要剥离特

  • 问题内容: 我正在考虑使用删除字符串中的某些字符。目前尚不清楚将要删除哪些字符(即我想删除哪些字符),但是我会假定任何字符都是有效的(例如和之类的东西,等等)。 我遇到了http://www.java-tips.org/java-se-tips/java.lang/strip-certain-characters- from-a-string.html, 但是肯定有比遍历每个字符更好的方法… 有什

  • 问题内容: 我在从字符串中删除非utf8字符时出现问题,这些字符无法正确显示。像这样的字符0x97 0x61 0x6C 0x6F(十六进制表示) 删除它们的最佳方法是什么?正则表达式还是其他? 问题答案: 使用正则表达式方法: 它搜索UTF-8序列,并将其捕获到组1中。它还与无法标识为UTF-8序列的一部分的单个字节匹配,但不捕获这些字节。替换是捕获到组1中的任何内容。这将有效删除所有无效字节。

  • 问题内容: 从网站提取数据时出现奇怪的字符: 如何删除不是非扩展ASCII字符的内容? 问题答案: 正则表达式替换将是最佳选择。使用作为一个例子的字符串,并使用匹配它,这是一个POSIX字符类: 什么是寻找所有可打印字符。相反,查找所有不可打印的字符。不属于当前字符集的所有字符都将被删除。 注意: 使用此方法之前,必须确保当前字符集为ASCII。POSIX字符类同时支持ASCII和Unicode,