![哪些工具可以在包含任何形式规范化的文件中找到 unicode (UTF-8) 文本?](https://linux22.com/image/152668/%E5%93%AA%E4%BA%9B%E5%B7%A5%E5%85%B7%E5%8F%AF%E4%BB%A5%E5%9C%A8%E5%8C%85%E5%90%AB%E4%BB%BB%E4%BD%95%E5%BD%A2%E5%BC%8F%E8%A7%84%E8%8C%83%E5%8C%96%E7%9A%84%E6%96%87%E4%BB%B6%E4%B8%AD%E6%89%BE%E5%88%B0%20unicode%20(UTF-8)%20%E6%96%87%E6%9C%AC%EF%BC%9F.png)
我喜欢在文件中查找国际文本,例如“müller”,甚至中文文本,无论使用哪种 unicode 表示形式和大小写。
即,“ü”是否以NFC或NFD格式存储并不重要。
我认为 grep 可以做到这一点,但至少 macOS 10.13.6 上可用的版本只能找到一种规范化形式。
我预计,使用 Aho–Corasick 等可以搜索单词中字母替代形式的算法,构建包含 UTF8 字符的每种替代形式的树,然后搜索所有组合应该不会那么困难。然而,至少我尝试过的 grep 并没有这样做。
是否有 grep 或其他文本查找工具的实现可以正确执行此操作?
答案1
我用正则表达式引擎(PCRE2)解决了这个问题。
基本上,我使用自己编写的代码将用户的搜索字符串转换为所有可能的 UTF-8 和 UTF-16 表示形式,然后将它们全部组合成一个正则表达式作为替代方案,并根据需要注意转义任何字符(例如,00
UTF-16 字符的字节被编码为\x00
)。
正则表达式构建决策树的性质使得搜索速度相当快。
这让我可以扫描任何二进制文件中的搜索字符串,无论它在文件中以哪种格式编码。
由于我在自己的一个程序中需要此功能,因此我应该提到编程解决方案也很受欢迎(然后它最好属于 StackOverflow 站点)。