Javascript 为什么不能在node.js中使用ascii模式在文件中写入空字节?

Javascript 为什么不能在node.js中使用ascii模式在文件中写入空字节?,javascript,node.js,Javascript,Node.js,这是我的密码 var fs = require('fs'); var fp = fs.openSync('binary.txt', "w"); var byte = '\0'; fs.writeSync(fp, byte, null, 'ascii'); 当我打开binary.txt文件时执行它之后,它包含0x20,而不是预期的空字节 现在当我使用 fs.writeSync(fp, byte, null, 'utf-8'); 我在文件中得到了想要的空字节。这不是因为文件本身,而是因为way

这是我的密码

var fs = require('fs');
var fp = fs.openSync('binary.txt', "w");

var byte = '\0';
fs.writeSync(fp, byte, null, 'ascii');
当我打开binary.txt文件时执行它之后,它包含0x20,而不是预期的空字节

现在当我使用

fs.writeSync(fp, byte, null, 'utf-8');

我在文件中得到了想要的空字节。

这不是因为文件本身,而是因为way Node将ASCII转换为字节进行写入。您将在以下内容中看到相同的行为:

new Buffer('\0', 'ascii')[0]
// 32
如果要将空字节写入文件,不要使用字符串,只需写入所需的字节即可

fs.writeSync(fp, new Buffer([0x00]));
通常,在执行文件IO时,我建议仅在内容显式为文本内容时使用字符串。如果您正在做超出此范围的事情,请坚持使用
Buffer
s

细节
实际上,执行此转换的是V8,而不是节点。节点将
ascii
编码公开为一种更快的转换为二进制的方法。为了实现这一点,它使用V8的
String::WriteOneByte
方法,除非明确指示不要这样做,否则此函数会自动将
'\0'
转换为
'

。您什么时候想将空字节写入文件?@jamesemanon在这种情况下不能确定,但许多文件格式是二进制的,而不是100%文本。例如,您可以有一个以位/字节为标志的标题部分来存储元数据,并有几个字节来指定文件中文本的起点。在最新节点上,如果将
'\0'
解释为空字节,则不再出现这种情况。