【问题标题】:how to deal with special characters in nodejs fs readdir function如何处理nodejs fs readdir函数中的特殊字符
【发布时间】:2013-02-09 23:13:34
【问题描述】:

我正在使用 fs.readdir() 函数读取 nodejs 中的目录。你给它一个包含路径的字符串,它返回一个数组,其中包含该目录路径内的所有文件,格式为字符串。它不适用于特殊字符(如 ï)。

我遇到了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
});

上述测试对没有特殊字符的文件正常工作。如何正确比较?

【问题讨论】:

    标签: node.js encoding special-characters readdir


    【解决方案1】:

    你的角色似乎是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 引擎无法正确解释代码中的 ï 字符。

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

    在这 (2) 种情况下,使用 npm 上可用的 unorm 库在比较字符串之前对字符串进行规范化(或原始的 UnicodeNormalizer

    【讨论】:

    • 不幸的是,这也不起作用(日志错误),Sublime Text 配置为对新文件使用 UTF8,但我认为只适用于内容而不适用于文件名?
    • 能否输出 encodeURIComponent(files[0]) 和 encodeURIComponent('maïs.md') 的值;这可能会提示@thejh 是否为您指明了正确的方向(组合的 unicode 字符)
    • 仅使用console.log 我得到mai%CC%88s.md 用于文件[0],ma%C3%AFs.md 用于从文字复制的文件。似乎什么时候到达某个地方!
    • ok %CC%88 是“组合分音符号 ¨” (\u0308) 的 utf8 表示。因此,正如@thejh 所暗示的那样,您的问题似乎确实是一个“unicode 规范化”问题。
    • node 的unorm 库确实可以解决我的问题!非常感谢您指点我! unorm.nfc(files[0]) === 'maïs.md' // true
    【解决方案2】:

    https://apple.stackexchange.com/a/10484/23863 看起来很相关——这可能是因为 ï 在 utf8 中有不同的表达方式。

    【讨论】:

    • 这看起来很棘手。我想要实现的目标:将目录中的文件名与存储在其他地方的文件名匹配。我想我需要找出如何改变不同的组合状态。
    猜你喜欢
    • 2011-12-06
    • 2010-11-19
    • 2012-04-05
    • 2013-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多