2013-02-24 218 views
1

我正在使用fs.readdir()函數讀取nodejs中的目錄。您爲它提供一個包含路徑的字符串,並以字符串格式返回包含該目錄路徑內所有文件的數組。它不適合我的特殊字符(如ï)。如何處理nodejs中的特殊字符fs readdir函數

我遇到了this similar issue,但是我在OS X上)。

首先,我創建了一個名爲encoding的新目錄,並創建了一個名爲maïs.md(使用我的編輯器Sublime Text)的文件。

fs.readdir('encoding', function(err, files) { 
    console.log(files);         // [ 'maïs.md' ] 
    console.log(files[0]);        // maïs.md 
    console.log(files[0] === 'maïs.md');     // false 
    console.log(files[0] == 'maïs.md');     // false 
    console.log(files[0].toString('utf8') === 'maïs.md'); // false 
}); 

上述測試對無特殊字符的文件正常工作。我如何正確比較這個?

+0

可能的[複製如何檢查Unicode字符串的平等在Javascript?](http://stackoverflow.com/questions/7097867/how-do-i-check-equality-of-unicode-strings-in-javascript) – thejh 2013-02-24 21:07:43

回答

0

你的性格似乎是this one。你應該

(1) console.log(files[0] == 'ma\u00EF;s.md'); 
(2) console.log(files[0] == 'mai\u0308;s.md'); 

嘗試如果(1)的作品則可能意味着包含你的代碼的文件沒有保存在UTF-8格式,所以Node.js的引擎不會在你的代碼解釋正確I字符。

如果(2)起作用,它可能意味着文件系統向節點引擎以分解的Unicode格式(我後面跟着一個變音符¨)給出了ï字符。 CF @thejh回答

在此(2)的情況下,使用unorm庫可在NPM比較之前標準化字符串(或原始UnicodeNormalizer

+0

不幸的是,這也不起作用(日誌爲false),崇高文本被配置爲使用UTF8的新文件,但我認爲只適用於內容而不是文件名? – askmike 2013-02-24 20:59:02

+0

你能輸出encodeURIComponent(文件[0])和encodeURIComponent('maïs.md')的值嗎?這可能暗示@thejh是否使用console.log指出你正確的方向(組成Unicode字符) – 2013-02-24 21:07:08

+0

我爲文件[0], 'ma%C3獲得'mai%CC%88s.md' %AFs.md'從文字複製的一個。看起來像什麼時候到了某個地方! – askmike 2013-02-24 21:19:14

0

https://apple.stackexchange.com/a/10484/23863看起來很相關 - 這可能是因爲在utf8中有不同的表達方式。

+0

這看起來非常棘手。我想實現的目標:將目錄中的文件名與其他地方存儲的文件名匹配。我想我需要找出如何改變不同的組合狀態。 – askmike 2013-02-24 20:44:06