0

vimgrep 是否能够搜索 unicode 字符串?例如:

a.txt包含宽字符串“hello”, vimgrep hello *.txt什么也没找到,当然它在正确的路径中。

4

2 回答 2

1

在这种情况下,“Unicode”有点误导。你所拥有的根本不是典型的文本“根据 Unicode 标准提供的任何方法编码”。它是一堆带有普通代码点的普通字符,由带有代码点的 NULL 字符000000. 一些 Java 程序确实会输出这种垃圾。

因此,如果您的搜索模式是hello,Vim 并且:vim完全能够搜索和查找hello(没有 NULL),但他们永远不会找到hello(有 NULL)。

另一方面,搜索h^@e^@l^@l^@o( ^@is ) 会找到(带有 NULL)但不会找到(没有 NULL)。<C-v><C-@>hellohello

无论如何,转换该文件/缓冲区或确保您不会遇到这样的垃圾是更好的长期解决方案。

于 2014-07-16T13:45:40.617 回答
1

如果 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。

于 2014-07-16T13:18:35.040 回答