vimgrep 是否能够搜索 unicode 字符串?例如:
a.txt
包含宽字符串“hello”, vimgrep hello *.txt
什么也没找到,当然它在正确的路径中。
在这种情况下,“Unicode”有点误导。你所拥有的根本不是典型的文本“根据 Unicode 标准提供的任何方法编码”。它是一堆带有普通代码点的普通字符,由带有代码点的 NULL 字符0000
或00
. 一些 Java 程序确实会输出这种垃圾。
因此,如果您的搜索模式是hello
,Vim 并且:vim
完全能够搜索和查找hello
(没有 NULL),但他们永远不会找到hello
(有 NULL)。
另一方面,搜索h^@e^@l^@l^@o
( ^@
is ) 会找到(带有 NULL)但不会找到(没有 NULL)。<C-v><C-@>
hello
hello
无论如何,转换该文件/缓冲区或确保您不会遇到这样的垃圾是更好的长期解决方案。
如果 Vim 可以检测到文件的编码,那么是的,Vim 可以 grep 文件。:vimgrep
通过首先将文件正常(甚至包括自动命令)读入隐藏缓冲区,然后搜索缓冲区来工作。
看起来您的文件是 little-endian UTF-16,没有字节顺序标记 (BOM)。Vim可以检测到这一点,但默认情况下不会。
首先,确保您的 Vim 在内部支持 unicode 的情况下运行。为此,:set encoding=utf-8
请在 .vimrc 的顶部。接下来,Vim 需要能够检测该文件的编码。该'fileencodings'
选项控制这一点。
默认情况下,当你将 'encoding' 设置为 utf-8 时,Vim 的 'fileencodings' 选项包含 "ucs-bom",它将检测 UTF-16,但仅当存在 BOM 时。要在不存在 BOM 时也检测到它,您需要将所需的编码添加到“fileencodings”。它需要在任何 8 位编码之前,但在 ucs-bom 之后。尝试在 .vimrc 顶部执行此操作并重新启动 Vim 以使用:
set encoding=utf-8
set fileencodings=ucs-bom,utf-16le,utf-8,default,latin1
现在加载具有所需编码的文件应该可以很好地进行编辑,因此也可以用于 vimgrep。