Php 使用BOM搜索UTF-8文件的优雅方式?

Php 使用BOM搜索UTF-8文件的优雅方式?,php,utf-8,shell,text-editor,Php,Utf 8,Shell,Text Editor,出于调试目的,我需要递归地在目录中搜索所有以UTF-8字节顺序标记(BOM)开头的文件。我当前的解决方案是一个简单的shell脚本: find -type f | while read file do if [ "`head -c 3 -- "$file"`" == $'\xef\xbb\xbf' ] then echo "found BOM in: $file" fi done 或者,如果您喜欢简短、不可读的单行线: find -type f|while

出于调试目的,我需要递归地在目录中搜索所有以UTF-8字节顺序标记(BOM)开头的文件。我当前的解决方案是一个简单的shell脚本:

find -type f |
while read file
do
    if [ "`head -c 3 -- "$file"`" == $'\xef\xbb\xbf' ]
    then
        echo "found BOM in: $file"
    fi
done
或者,如果您喜欢简短、不可读的单行线:

find -type f|while read file;do [ "`head -c3 -- "$file"`" == $'\xef\xbb\xbf' ] && echo "found BOM in: $file";done
它不适用于包含换行符的文件名, 但无论如何,这样的文件是不可能出现的

有没有更短或更优雅的解决方案


文本编辑器有什么有趣的文本编辑器或宏吗?

如果您接受了一些假阳性(如果有非文本文件,或者在文件中间不存在ZWNBSP),可以使用GRP:< /P>
fgrep -rl `echo -ne '\xef\xbb\xbf'` .
  • find-print0
    在每个文件名之间放置null\0,而不是使用新行
  • xargs-0
    要求使用空分隔参数,而不是行分隔参数
  • grep-l
    列出与正则表达式匹配的文件
  • regex
    ^\xeff\xbb\xbf
    并不完全正确,因为如果非BOMed UTF-8文件在行首有零宽度空格,它将匹配这些文件

我会使用类似于:

grep -orHbm1 "^`echo -ne '\xef\xbb\xbf'`" . | sed '/:0:/!d;s/:0:.*//'
./invalid.php: TRAILING whitespace ("?>\n")
./invalid.php: UTF-8 BOM alone ("\xEF\xBB\xBF")

这将确保BOM表从文件的第一个字节开始出现。

这个简单的命令如何,它不仅查找而且清除讨厌的BOM表?:)

我喜欢“寻找”:

警告上述操作将修改包含这三个字符的二进制文件

如果只想显示BOM表文件,请使用以下选项:

grep -rl $'\xEF\xBB\xBF' .

上面给出的大多数解决方案都比文件的第一行测试更多,即使有些解决方案(如Marcus的解决方案)会过滤结果。此解决方案只测试每个文件的第一行,因此速度应该更快。

在Windows上执行此操作的最佳和最简单方法:

→ 转到项目的根目录→ 查找文件(Alt+F7)→ 文件类型**→ 查找文本“EF BB BF”→ 选中“十六进制”复选框→ 搜寻


您将获得以下列表:)

对于Windows用户,请参阅(用于在项目中查找
BOM
的好PHP脚本)。

解决此问题的一个简单方法是(不是同名的
vi
工具),它专门查找PHP脚本:

phptags --warn ./
将输出如下内容:

grep -orHbm1 "^`echo -ne '\xef\xbb\xbf'`" . | sed '/:0:/!d;s/:0:.*//'
./invalid.php: TRAILING whitespace ("?>\n")
./invalid.php: UTF-8 BOM alone ("\xEF\xBB\xBF")

--whitespace
模式将自动修复此类问题(递归地,但声明它只重写.php脚本)。

我使用此模式仅更正JavaScript文件:

find . -iname *.js -type f -exec sed 's/^\xEF\xBB\xBF//' -i.bak {} \; -exec rm {}.bak \;

您可以使用
grep
查找它们,并使用Perl将它们删除,如下所示:

grep -rl $'\xEF\xBB\xBF' . | xargs perl -i -pe 's{\xEF\xBB\xBF}{}'

如果您正在查找UTF文件,则可以使用。它将告诉您文件的编码是什么。如果其中有任何非ASCII字符,它将使用UTF

file *.php | grep UTF
但这不会递归地起作用。您可能可以装配一些奇特的命令使其递归,但我只是像下面那样逐个搜索每个级别,直到用尽所有级别

file */*.php | grep UTF

在grepGot在Linux(RHEL6)
find上处理以下内容之前,管道中仍然需要一个“head1”-键入f-print0 | xargs-0 awk'/^\xEF\xBB\xBF/{print FILENAME}{nextfile}'
找到这些文件后,如何修改代码以修复它们?错误地检测带有BOM标记的PDF。。这是因为它搜索整个文档,而不仅仅是第一行或使用ack:“ack'\xEF\xBB\xBF'”将sed命令更改为在前导的“s”之前添加1,这样它只适用于第一行使用
grep-rlI$'\xEF\xBB\xBF.
忽略二进制文件。检测并修改JPG和其他二进制文件,如前所述。链接的网站显示:“网站离线,没有可用的缓存版本”。github中也有相同的脚本:谢谢,伙计,你的回答救了我一天。还有一个BOM查找器:(如果有人不喜欢“自动”清理,或者只是想找到带有BOM的文件)很好,特别是我长期以来最喜欢的Total commander的使用,但不幸的是,它和其他许多应用程序遇到了相同的问题:它搜索fle中的所有字节,报告了如此多的图像等。通过使用正则表达式而不是十六进制并搜索“^\xEF\xBB\xBF”,可以稍微改善这一点。搜索“^\xEF\xBB\xBF”将消除许多图像,但仍有文件在文件的中间包含BOM表(虽然应该很少),当然,任何碰巧包含ascii换行符码的二进制文件都只是BOM表的一部分。尽管如此,所有的图片都在我的测试搜索中消失了。这一张对我有效,但被接受的答案没有(我在Mac电脑上)
file */*.php | grep UTF