我正在尝试编写使用JavaScript以UTF-8编码的文本文件。
我必须通过命令行编写此文本文件,所以我的代码如下所示……
我的script.js:
const text = 'this is test text';
const fs = require('fs);
fs.writeFileSync('./test.txt', text, "utf8");
我的package.json:
{
"name": "test-project",
"version": "0.1.0",
"private": true,
"dependencies": {
"@babel/cli": "^7.8.4",
"@babel/core": "^7.9.0",
"@babel/plugin-transform-runtime": "^7.9.0",
"@babel/preset-env": "^7.9.5",
"@babel/preset-react": "^7.9.4",
"@babel/register": "^7.9.0",
"@testing-library/jest-dom": "^4.2.4",
"@testing-library/react": "^9.3.2",
"@testing-library/user-event": "^7.1.2",
"axios": "^0.19.2",
"bootstrap": "^4.4.1",
"glob": "^7.1.6",
"jquery": "^3.4.1",
"react": "^16.12.0",
"react-bootstrap": "^1.0.0-beta.17",
"react-dom": "^16.12.0",
"react-helmet": "^5.2.1",
"react-router-dom": "^5.1.2",
"react-router-sitemap": "^1.2.0",
"react-scripts": "3.4.0",
"react-table": "^7.0.0-rc.16",
"recharts": "^2.0.0-beta.1"
},
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject",
"sitemap": "node src/sitemap.js"
},
"eslintConfig": {
"extends": "react-app"
},
"browserslist": {
"production": [
">0.2%",
"not dead",
"not op_mini all"
],
"development": [
"last 1 chrome version",
"last 1 firefox version",
"last 1 safari version"
]
}
}
,然后在终端中运行以下命令:
$ node script.js
$ file --mime test.txt
$ test.txt: text/plain; charset=us-ascii
问题:
由fs.writeFileSync创建的文件以us-ascii而非utf-8编码。
如何在UTF-8中写入文件?
*注意:我使用的是日文PC,所以它可能会影响文件的编码?
*注2:我在下面尝试过,结果是相同的...
const stream = fs.createWriteStream('.test.txt', "utf8");
stream.once('open', () => {
stream.write('this is test text');
});
答案 0 :(得分:1)
fs.writeFileSync不在UTF-8中写入文件
实际上是的。 US-ASCII是字符代码为127及以下的字符的UTF-8的子集。因此,它既是US-ASCII,又是UTF-8。
对于127以下的纯ascii字符,UTF-8和US-ASCII之间没有物理差异。 US-ASCII字符使用UTF-8进行编码。
您正在编写的文件通常不会记录它是什么字符集。阅读软件可以根据找到的数据推断编码,也可以使用其他线索(例如文件扩展名)进行猜测。因此,您的程序只是告诉您文件符合US-ASCII的所有要求,因此看起来像是US-ASCII,它恰好是UTF-8的子集。
在其中放置一些日语字符,由于它们不适合US-ASCII,因此外观会有所不同。他们将使用多个字节来正确编码。