Node.js 如何处理nodejs fs readdir函数中的特殊字符

Node.js 如何处理nodejs fs readdir函数中的特殊字符,node.js,encoding,special-characters,readdir,Node.js,Encoding,Special Characters,Readdir,我正在使用fs.readdir()函数读取nodejs中的目录。您向它提供一个包含路径的字符串,它返回一个数组,该数组以字符串格式包含该目录路径中的所有文件。它不适合我使用特殊字符(如i) 我遇到过,但我在OSX上) 首先,我创建了一个名为encoding的新目录,并创建了一个名为maïs.md的文件(使用我的编辑器Sublime Text) 对于没有特殊字符的文件,上述测试正常工作。我怎样才能正确地比较呢?看起来很相关——这可能是因为在utf8中有不同的方式来表达I。您的角色似乎是。你应该试试

我正在使用
fs.readdir()
函数读取nodejs中的目录。您向它提供一个包含路径的字符串,它返回一个数组,该数组以字符串格式包含该目录路径中的所有文件。它不适合我使用特殊字符(如
i

我遇到过,但我在OSX上)

首先,我创建了一个名为
encoding
的新目录,并创建了一个名为
maïs.md
的文件(使用我的编辑器Sublime Text)

对于没有特殊字符的文件,上述测试正常工作。我怎样才能正确地比较呢?

看起来很相关——这可能是因为在utf8中有不同的方式来表达I。

您的角色似乎是。你应该试试看

(1) console.log(files[0] == 'ma\u00EF;s.md'); 
(2) console.log(files[0] == 'mai\u0308;s.md'); 
如果(1)有效,则可能意味着包含代码的文件未以utf-8格式保存,因此node.js引擎无法正确解释代码中的ï字符

如果(2)起作用,则可能意味着文件系统以分解的unicode形式将ï字符提供给节点引擎(i后跟一个双字符)。cf@thejh答案


在这种情况下,在比较字符串(或原始字符串)之前,请使用npm上提供的库来规范化字符串。

这看起来非常棘手。我想要实现的是:将目录中的文件名与存储在别处的文件名进行匹配。我想我需要找出如何更改不同的组合状态。不幸的是,这也不起作用(logs false),Sublime Text被配置为对新文件使用UTF8,但我认为这只适用于内容,而不适用于文件名?您可以输出encodeURIComponent(文件[0])和encodeURIComponent('maïs.md')的值吗;这可能会提示@thejh是否仅仅使用console.log I get
mai%CC%88s.md
为文件[0]指明了正确的方向(由unicode字符组成),对于从文本文件复制的文件,
ma%C3%AFs.md
。好像我们什么时候到了什么地方!ok%CC%88是“合并分录”的utf8表示形式(\u0308)。因此,正如@thejh所暗示的那样,您的问题似乎确实是一个“unicode规范化”问题。node的
unorm
库确实解决了我的问题!非常感谢你给我指出它
unorm.nfc(文件[0])==='maïs.md'//true
(1) console.log(files[0] == 'ma\u00EF;s.md'); 
(2) console.log(files[0] == 'mai\u0308;s.md');