fs.writeFileSyn c не записывает файл в UTF-8 - PullRequest
0 голосов
/ 22 апреля 2020

Я пытаюсь написать текстовый файл в кодировке UTF-8 с JavaScript. Я должен написать этот текстовый файл через командную строку, поэтому мой код выглядит следующим образом ...

Мой скрипт. js:

const text = 'this is test text';
const fs = require('fs);
fs.writeFileSync('./test.txt', text, "utf8");

Мой пакет. 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.writeFileSyn c, закодирован в us-ascii, не UTF-8. Как я могу записать файл в UTF-8? * ПРИМЕЧАНИЕ: я использую японский P C, так что это может повлиять на кодировку файла? * NOTE2: я попробовал ниже, и результат тот же ...

const stream = fs.createWriteStream('.test.txt', "utf8");
stream.once('open', () => {
    stream.write('this is test text');
});

1 Ответ

1 голос
/ 22 апреля 2020

fs.writeFileSyn c не записывает файл в UTF-8

На самом деле это так. US-ASCII - это подмножество UTF-8 для символов с кодом символа 127 и ниже. Таким образом, это US-ASCII и UTF-8.

Для простых символов ascii ниже 127, между UTF-8 и US-ASCII нет никакой физической разницы. Символы US-ASCII кодируют себя в UTF-8.

Файл, который вы пишете, обычно не записывает, какой это набор символов. Программное обеспечение для чтения должно либо выводить кодировку из найденных данных, либо использовать другие ключи, такие как расширение файла, чтобы угадать. Итак, ваша программа просто сообщает вам, что ваш файл соответствует всем требованиям US-ASCII и, таким образом, выглядит как US-ASCII, который является подмножеством UTF-8.

Поместите туда несколько японских символов и это будет выглядеть иначе, так как они не вписываются в US-ASCII. Они будут использовать несколько байтов для правильного кодирования.

...