Разобрать XML UTF-8 в javascript

Я пытаюсь загрузить и проанализировать простой XML-файл с кодировкой utf-8 в javascript, используя node и пакеты xpath и xmldom. Пространства имен XML не используются, и один и тот же XML анализируется при преобразовании в ASCII. Я вижу в отладчике в VS Code, что в строке есть встроенные пробелы между каждым символом (конечно, из-за неправильной загрузки файла utf-8), но я не могу найти способ правильно загрузить и проанализировать файл utf-8.

Код:

var xpath = require('xpath')
  , dom = require('xmldom').DOMParser;

const fs = require('fs');

var myXml = "path_to_my_file.xml";

var xmlContents = fs.readFileSync(myXml, 'utf8').toString();

// this line causes errors parsing every single tag as the tag names have spaces in them from improper utf-8 decoding
var doc = new dom().parseFromString(xmlContents, 'application/xml');
var cvNode = xpath.select1("//MyTag", doc);

console.log(cvNode.textContent);

Код работает нормально, если файл ASCII (textContent имеет правильные данные), но если это UTF-8, то возникает ряд ошибок синтаксического анализа, а cvNode равно undefined.

Есть ли правильный способ анализа XML UTF-8 в узле/javascript? Я не могу для жизни мне найти достойный пример.


person Mike Marshall    schedule 19.11.2019    source источник
comment
Вы пробовали 'utf8' без минуса? Это правильное значение для кодировки utf-8 в этом API. С другой стороны, когда вы видите дополнительные пробелы между каждой буквой, это говорит о том, что файл на самом деле не закодирован с использованием utf-8, а использует кодировку с 16-битной базой. Вы пробовали 'utf16le'?   -  person NineBerry    schedule 19.11.2019
comment
да, извините, опечатка. я пробовал оба   -  person Mike Marshall    schedule 19.11.2019
comment
@NineBerry utf16le сделал свое дело. Огромное спасибо. Если вы хотите добавить официальный ответ, я отмечу его как таковой.   -  person Mike Marshall    schedule 19.11.2019


Ответы (1)


Когда вы видите дополнительные пробелы между каждой буквой, это говорит о том, что файл на самом деле не закодирован с использованием utf-8, а использует 16-битную кодировку Unicode.

Попробуйте 'utf16le'.

Список поддерживаемых кодировок см. в разделе Буферы и кодировки символов.

person NineBerry    schedule 19.11.2019