Danh sách các mã hóa mà Node.js hỗ trợ


136

Tôi cần đọc một tệp được mã hóa bằng ISO-8859-1 (còn được gọi là latin1), đại loại như thế này:

var file_contents = fs.readFileSync("test_data.html", "latin1");

Tuy nhiên, Node phàn nàn về "latin1" hoặc "ISO-8859-1" không phải là mã hóa hợp lệ ("Lỗi: Mã hóa không xác định").

Những gì mã hóa không readFileSyncchấp nhận?


Tôi không biết nếu đó là một tùy chọn để chuyển đổi tệp nguồn thành utf8. Nếu vậy, đây là một liên kết. superuser.com/questions/762473/ansi-to-utf-8-in-notepad
mathheadinclouds

Câu trả lời:


223

Các danh sách mã hóa mà hỗ trợ nút natively là khá ngắn:

  • ascii
  • cơ sở64
  • lục giác
  • ucs2 / ucs-2 / utf16le / utf-16le
  • utf8 / utf-8
  • binary / latin1 (ISO8859-1, latin1 chỉ trong nút 6.4.0+)

Nếu bạn đang sử dụng phiên bản cũ hơn 6.4.0 hoặc không muốn xử lý các mã hóa không phải là Unicode, bạn có thể mã hóa lại chuỗi:

Sử dụng iconv-lite để mã hóa lại các tệp:

var iconvlite = require('iconv-lite');
var fs = require('fs');

function readFileSync_encoding(filename, encoding) {
    var content = fs.readFileSync(filename);
    return iconvlite.decode(content, encoding);
}

Ngoài ra, sử dụng iconv :

var Iconv = require('iconv').Iconv;
var fs = require('fs');

function readFileSync_encoding(filename, encoding) {
    var content = fs.readFileSync(filename);
    var iconv = new Iconv(encoding, 'UTF-8');
    var buffer = iconv.convert(content);
    return buffer.toString('utf8');
}

1
Đối với những người có vấn đề biên dịch iconv, tôi khuyên dùng iconv-lite . Nó không yêu cầu biên dịch và theo dev thì nhanh hơn iconv và nó được sử dụng bởi các công cụ phổ biến như Grunt, Nodemailer, Yeoman, ...
Telémako

Để sử dụng với Electron cài đặt lib và lưu dưới dạng phụ thuộc sản xuất:npm install iconv-lite --save
DenisKolodin

bây giờ, latin1cũng được bao gồm dưới dạng bí danh củaascii
thybzi

2
Những gì bạn đã nói trong câu trả lời - rằng ISO-8859-1 (aka latin1) không được hỗ trợ - không phải là trường hợp của Node v8.1.4. Xem trang tài liệu này để xem tất cả các mã hóa được hỗ trợ bởi Bộ đệm, bao gồm latin1(có bí danh là binary).
nbkhope

1
@PanuLogic Khi bạn chuyển đổi từ chuỗi byte sang chuỗi ký tự, bạn cần một số mã hóa. latin1có thể đảo ngược - ngay cả khi đầu vào của bạn là tệp video mp4, chuỗi sẽ hợp lệ (mặc dù vô nghĩa) và chuyển đổi trở lại byte sẽ mang lại các byte gốc. Sử dụng a Buffer/ Uint8Arraycho dữ liệu nhị phân.
phihag

0

Nếu giải pháp trên không hiệu quả với bạn, có thể có được kết quả tương tự với mã nodejs thuần sau đây. Ở trên không hoạt động với tôi và dẫn đến một ngoại lệ biên dịch khi chạy 'npm install iconv' trên OSX:

npm install iconv

npm WARN package.json portalServer@0.1.0 No README.md file found!
npm http GET https://registry.npmjs.org/iconv
npm http 200 https://registry.npmjs.org/iconv
npm http GET https://registry.npmjs.org/iconv/-/iconv-2.0.4.tgz
npm http 200 https://registry.npmjs.org/iconv/-/iconv-2.0.4.tgz

> iconv@2.0.4 install /Users/markboyd/git/portal/app/node_modules/iconv
> node-gyp rebuild

gyp http GET http://nodejs.org/dist/v0.10.1/node-v0.10.1.tar.gz
gyp http 200 http://nodejs.org/dist/v0.10.1/node-v0.10.1.tar.gz
xcode-select: Error: No Xcode is selected. Use xcode-select -switch <path-to-xcode>, or see the xcode-select manpage (man xcode-select) for further information.

fs.readFileSync () trả về Bộ đệm nếu không có mã hóa nào được chỉ định. Và Bộ đệm có phương thức toString () sẽ chuyển đổi thành UTF8 nếu không có mã hóa nào được chỉ định cung cấp cho bạn nội dung của tệp. Xem tài liệu của nodejs. Điều này làm việc cho tôi.


1
Vấn đề là Bộ đệm giả định dữ liệu đã có trong utf8 nếu không được chỉ định và sẽ không thực hiện chuyển đổi từ latin1 sang utf8.
bluesmoon
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.