JavaScript读取文件后字符串比较返回false问题排查
问题根因
你看到的\r是回车控制符(Carriage Return,ASCII 编码为13),这是不同操作系统文本换行规则差异导致的:
- Windows系统下文本文件的换行标识是
\r\n(回车符+换行符两个字符组合,即CRLF格式) - 类Unix(Linux/macOS等)系统下文本换行只用单个
\n字符(即LF格式)
你读取文件后仅按\n分割字符串,就会把每行末尾跟着的\r留在每个数组元素的末尾,最终得到的数组元素实际是'January\r'、'February\r'这类带隐藏后缀的字符串。
console.log(req.body.month)打印时看起来正常,是因为\r属于不可见控制字符,它的作用只是把控制台光标移动到当前行的开头,不会输出可见内容,所以肉眼看不到它的存在。你可以自行打印req.body.month.length验证:带\r的字符串长度是9,而纯'February'长度为8。字符串相等判断是逐字符精确匹配的,末尾多了一个\r字符的字符串和纯'February'对比,自然会返回false,这就是问题的直接原因。
修复方案
选任意一种方案处理即可:
- 方案1:分割字符串前先统一清理换行符,兼容不同系统的换行格式
var data = fs.readFileSync('./months.txt'); // 把所有\r\n、\r格式的换行统一替换为\n再分割,最后过滤文件末尾可能产生的空行 data = data.toString().replace(/\r\n?/g, '\n').split('\n').filter(line => line.trim() !== ''); - 方案2:分割时用正则同时匹配不同系统的换行符
var data = fs.readFileSync('./months.txt'); data = data.toString().split(/\r?\n/).filter(Boolean); - 方案3:分割后单独移除每行末尾的回车符
var data = fs.readFileSync('./months.txt'); data = data.toString().split('\n').map(line => line.trimEnd());
内容的提问来源于stack exchange,提问作者NodeFriend
相关产品推荐
相关产品推荐

