findstr 或 grab 自动检测字符编码 (UTF-16)

Posted

技术标签:

【中文标题】findstr 或 grab 自动检测字符编码 (UTF-16)【英文标题】:findstr or grep that autodetects chararacter encoding (UTF-16) 【发布时间】:2010-09-29 07:33:31 【问题描述】:

我想这样做:

 findstr /s /c:some-symbol *

或 grep 等价物

 grep -R some-symbol *

但我需要该实用程序来自动检测以 UTF-16(和朋友)编码的文件并适当地搜索它们。我的文件中甚至还有字节排序标记 FFEE,所以我什至不寻找英雄的自动检测。

有什么建议吗?


我指的是 Windows Vista 和 XP。

【问题讨论】:

您的文件中有些是 UTF-16 还是有些是 ASCII,还是什么? 是的,一些 ASCII,一些 UTF-16。 【参考方案1】:

根据 Damon Cortesi 的 blog article,正如您所发现的,grep 不适用于 UTF-16 文件。但是,它提出了这种解决方法:

for f in `find . -type f | xargs -I  file  | grep UTF-16 | cut -f1 -d\:`
        do iconv -f UTF-16 -t UTF-8 $f | grep -iH --label=$f $GREP_FOR
done

这显然适用于 Unix,不确定 Windows 上的等价物是什么。那篇文章的作者还提供了一个 shell 脚本来执行上述操作,您可以在 github here 上找到。

这仅 greps UTF-16 文件。您还可以以正常方式 grep ASCII 文件。

【讨论】:

【参考方案2】:

您没有说要在哪个平台上执行此操作。

在 Windows 上,您可以使用 PowerGREP,它会自动检测以字节顺序标记开头的 Unicode 文件。 (还有一个选项可以自动检测没有 BOM 的文件。自动检测对于 UTF-8 非常可靠,但对于 UTF-16 是有限的。)

【讨论】:

【参考方案3】:

感谢您的建议。我指的是 Windows Vista 和 XP。

我还发现了这个解决方法,使用免费的Sysinternals strings.exe

C:\> strings -s -b dir_tree_to_search | grep regexp 

Strings.exe 提取它找到的所有字符串(来自二进制文件,但也适用于文本文件)并在每个结果前面加上文件名和冒号,因此在正则表达式中考虑到这一点(或使用 cut 或其他步骤在管线中)。 -s 使它进行递归提取,-b 只是抑制横幅消息。

最终我还是有点惊讶,旗舰搜索实用程序 Gnu grepfindstr 不能原生处理 Unicode 字符编码。

【讨论】:

在他们的家庭 unix 环境中,UTF-16 不太常见,文件通常是 UTF-8,它们处理得很好。 对于提取整行可能不是很好,但对于尝试查找包含字符串的所有文件(我正在尝试这样做)是完美的。谢谢。【参考方案4】:

在 Windows 上,您也可以使用 find.exe。

find /i /n "YourSearchString" *.*

唯一的问题是这会打印文件名,然后是匹配项。您可以通过管道过滤它们到 findstr

find /i /n "YourSearchString" *.* | findstr /i "YourSearchString"

【讨论】:

不幸的是 find 命令不支持像 findstr(通配符/正则表达式)这样的匹配模式。【参考方案5】:

解决方法是将 UTF-16 转换为 ASCII 或 ANSI

TYPE UTF-16.txt > ASCII.txt

然后你可以使用 FINDSTR。

FINDSTR object ASCII.txt

【讨论】:

...对不起,什么? type UTF-16.txt | findstr 如果您不需要文件名(OP 需要文件名,因为搜索多个文件,但有些人可能会觉得这很有用)【参考方案6】:
findstr /s /c:some-symbol *

可以替换为以下字符编码感知命令:

for /r %f in (*) do @find /i /n "some-symbol" "%f"

【讨论】:

如果在下面添加 Venkateshwar 的答案,你会得到: for /r %f in (*) do @find /i /n "some-symbol" "%f" | findstr /i "some-symbol" 将过滤掉文件名。在搜索一组寻找“失败”的文件时,我发现这很有用。我不在乎它出现在哪个文件中,我只是想看看是否有任何文件中有“失败”。【参考方案7】:

在更高版本的 Windows 中,UTF-16 支持开箱即用。如果没有,请尝试通过chcp 命令更改活动代码页。

在我的情况下,单独使用 findstr 无法处理 UTF-16 文件,但它适用于 type

type *.* | findstr /s /c:some-symbol

【讨论】:

以上是关于findstr 或 grab 自动检测字符编码 (UTF-16)的主要内容,如果未能解决你的问题,请参考以下文章

FINDSTR正则表达式的基本用法

在Tomcat中自动检测URI编码

python3 爬虫(urllib+beautifulsoup)beautifulsoup自动检测编码错误

让VSCode支持gbk编码

自动编码器检测检测信用卡欺诈

python库总结(转)