2014-07-16 72 views
0

vimgrep能够搜索unicode字符串吗? 例如: (VIM)vimgrep能够搜索unicode字符串

a.txt包含宽字符串“hello”,vimgrep hello *.txt一无所获,当然这是在正确的道路。

+0

你是什么意思“宽字符串”? “你好”并不是一个真正的unicode的好例子。你的工作目录中是否有'a.txt'? – romainl

+0

“宽字符串”我的意思是unicode字符串,我用图像更新了帖子。 “a.txt”在工作目录中。 – aj3423

回答

1

“Unicode”在这种情况下有点误导。你所拥有的并不是典型的“按照Unicode标准提供的任何方法进行编码的文本”。这是一组正常字符,正常代码点以空字符分隔,代码点为000000。一些Java程序确实输出那种垃圾。

所以,如果你的搜索模式hello,Vim后:vim是完全能够搜索并找到hello(无空值),但他们永远不会找到hello(如果为空)。

h^@e^@l^@l^@o搜索(^@<C-v><[email protected]>),而另一方面,会发现hello(如果为空),但不hello(无空值)。

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

+0

是UTF-16 Little Endian不是Unicode吗?或者标准是否需要BOM?我认为BOM总是可选的。 – Ben

+0

它不是“所有的unicode”。 “你好”和“你好”都是“unicode”,但一个很好,另一个是噩梦。所以是的,只要用户知道他在做什么,Vim就可以完美地使用“unicode”。 – romainl

1

如果Vim能检测到文件的编码,那么是的,Vim可以grep文件。 :vimgrep通过在正常(甚至包括autocmds)文件中首次读取到隐藏缓冲区中,然后搜索缓冲区。

它看起来像你的文件是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。

+0

谢谢,它的工作原理。 – aj3423