2014-07-16 103 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