文件中显示<0xEF,0xBB,0xBF>字符。如何删除它们?


86

我正在压缩JavaScript文件,而压缩程序则抱怨我的文件中含有字符。

如何搜索并删除这些字符?


16
这不是<U+FEFF>,那是<0xEF,0xBB,0xBF>那是UTF8文件BOM,所以你应该更改标题。您想如何删除它们?通过魔术仙子?通过命令行工具?通过一对一编辑?Notepad ++可以将编码更改为不带BOM的UTF8。例如,仅搜索了5秒钟的“ strip BOM utf8”,我已经在Linux上找到了它:ueber.net/who/mjl/projects/bomstrip
xanatos 2011年

1
如果您告诉我们您要使用哪种javascript工具进行压缩,在什么平台上以及哪些其他工具是构建过程的一部分,它可能会帮助您获得与您的问题特别相关的答案。
SingleNegationElimination

15
UTF-8中的BOM是绝对可靠的。您需要找到该文件的生产者,并告诉他们将其@@ %%切掉。
tchrist 2011年

4
@peterflynn:U+FEFF是用于BOM的Unicode代码点,但BOM本身就是该代码点的编码方式(UTF-8:0xEF 0xBB 0xBF,UTF-16LE:0xFF 0xFE,UTF-16BE:0xFE 0xFF等)。因此,所涉及的文件是UTF-8编码的,压缩程序在将其解码为实际的Unicode代码点时会检测到这些文件。
雷米·勒博2015年

4
@xanatos不管它是什么,它都是这样体现的,这就是人们可以使用搜索引擎轻松找到此问题的方式。
BartoszKP

Answers:


18
perl -pi~ -CSD -e 's/^\x{fffe}//' file1.js path/to/file2.js

如果文件中包含其他utf-8,我认为该工具会损坏,但是如果没有,也许该解决方法可以为您提供帮助。(未经测试...)

编辑-CSD根据tchrist的评论添加了该选项。


1
您需要运行该-CSD开关,或将其PERL_UNICODE变量设置SD为,才能正常运行。
tchrist 2011年

正则表达式工作正常,可以删除行首的<fffe>字符,替换行中的所有<fffe>字符:'s / \ x {fffe} // g'。
迭戈·皮诺

2
在Mac OSX上,我必须更改为:perl -CSD -pe 's/^\x{feff}//' file.csv,请注意从<fffe>更改为<feff>。
mpettis 2014年

1
@mpettis那不是BOM表,而是字节反转的BOM表。如果您将UTF-16转换为UTF-8并得到字节顺序错误(即使BOM的目的是为了防止该错误!),则可能在任何平台上发生
2014年

1
@blong呢?问一个单独的问题,如果你不能弄清楚(但它可能会被标记为重复;第一谷歌命中stackoverflow.com/questions/1712188/...
tripleee

185

您可以使用vim轻松删除它们,步骤如下:

1)在终端中,使用vim打开文件:

vim file_name

2)删除所有BOM表字符:

:set nobomb

3)保存文件:

:wq

这个解决方案对我有用。它比所选答案更简单。谢谢
szydan 2014年

即使我通常是emacs游击队员,我也使用了这种出色的解决方案。vim ftw
Ellen Spertus

30

删除那些字符的另一种方法-使用Vim

vim -b文件名

现在,那些“隐藏”字符是可见的(<feff>),可以将其删除。


20

感谢您之前的回答,以下是sed(1)的变体,以防万一:

sed '1s/^\xEF\xBB\xBF//'

1
其他来源建议将数字1放在样式之前,例如“ sed'1 s / \ xEF \ xBB \ xBF //”,以仅与第一行匹配。但是,对我来说,在Mac OS X上,这两种方法都行不通。
玛丽安

1
这行得通,对我来说是最好的解决方案。谢谢你,先生!
万斯·卢卡斯2014年

1
喜欢这个解决方案。最容易实现且仍可扩展... :)
Piko

1
@Marian有点晚了,但是您可以检查Masum的答案,以显示为什么它在Mac上不起作用。
有人仍在使用您MS-DOS

1
将-i添加到sed以使用更改更新文件。
约翰(Johan)

17

在Unix / Linux上:

sed 's/\xEF\xBB\xBF//' < inputfile > outputfile

在MacOSX上

sed $'s/\xEF\xBB\xBF//' < inputfile > outputfile

注意Mac sed之后的$。

在Windows上

Super Sedsed的增强版本。对于Windows,这是一个独立的.exe,旨在从命令行运行。


1
“在为Mac sed之后,请注意$。” - 谢谢你,先生!
有人仍在使用您MS-DOS

1
Bash“ C样式”字符串$'\xEF\xBB\xBF//'是Bash功能,尤其不是Mac或OSX功能。通过这种构造,Bash将在将命令行传递给之前将转义序列解析为实际字节sed。根据您的sed变体,此方法可能会或可能不起作用(尽管我确信OSX用户知道应该为他们开箱即用是有用的)。
2015年

1
也许sed -i's /.../.../'–
Arthur

6

使用tail可能会更容易:

tail --bytes=+4 filename > new_filename

1
文件的生产者删除BOM后,此技术将失败。
无法



2

“文件”命令显示BOM是否存在:

例如:“ file myfile.xml”显示:“ XML 1.0文档,UTF-8 Unicode(带有BOM)文本,行很长,带有CRLF行终止符”

dos2unix将删除BOM。



1

Sublime Text中,您可以安装Highlighter包,然后在用户设置中自定义正则表达式。

在这里,我添加\uFEFFhighlighter_regex属性的末尾。

{
    "highlighter_enabled": true,
    "highlighter_regex": "(\t+ +)|( +\t+)|[\u2026\u2018\u2019\u201c\u201d\u2013\u2014\uFEFF]|[\t ]+$",
    "highlighter_scope_name": "invalid",
    "highlighter_max_file_size": 1048576,
    "highlighter_delay": 3000
}

要覆盖默认软件包设置,请在以下位置放置文件:

〜/ .config / sublime-text-3 / Packages / User / highlighter.sublime-settings


1

我建议使用“ dos2unix”工具,请测试运行dos2unix ./thefile.js

如有必要,请尝试对多个文件使用类似的方法:

for x in $(find . -type f -exec echo {} +); do dos2unix $x ; done

致以我的问候。


1
我喜欢您的答案-bomstrip在我的Mac上不易使用-因此花点时间为您提供简单的版本:find . -type f -exec dos2unix '{}' +
dsz

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.