BLOB-объект с преобразованием в 8-битный cp1251 или cp1252

Мне нужно решение с кодировкой UTF для 8-битных CP1251 или CP1252 с использованием BLOB-объектов

Мне удалось изменить https://github.com/b4stien/js-csv-encoding включая windows 1251, но есть неразрешимые проблемы:

К сожалению, noscript не позволяет загружать внешний javascript на страницу с отключенными через него скриптами.

Следовательно, невозможно использовать js-csv-кодирование в закладке, а также загружать jquery! Отключение noscript, особенно после распада и призрака, просто небезопасно.

Следовательно, осталась только версия небольшого скрипта, написанного на нативном javascript. Если вы найдете альтернативный способ запуска jquery с отключенным noscript, то найти решение будет проще, хотя я сомневаюсь, что это возможно.

Хорошим решением будет https://www.npmjs.com/package/windows-1251 или https://www.npmjs.com/package/windows-1252 Однако не удается преобразовать двухбайтовый текст в однобайтовый текст через эти скрипты. Например:

<script src="windows-1251.js"></script>
<script type="text/javascript">
function download(text, name, type) {
var a = document.getElementById("a");
var file = new Blob([text], {type: type});
a.href = URL.createObjectURL(file);
a.download = name;
</script>

Было много попыток использовать windows1251, например:

<script type="text/javascript">
function exportToCsv() {
window.open(windows1251.encode('data:text/csv;charset=windows-1251,' +'текст'));
}
var button = document.getElementById('b');
button.addEventListener('click', exportToCsv);
</script>

<script type="text/javascript">
function exportToCsv() {window.open('data:text/csv;charset=windows-1251,' +windows1251.encode('текст'));}

var button = document.getElementById('b');
button.addEventListener('click', exportToCsv);
</script>

Использование кодирования или декодирования из windows-1251 не переводит скрипт в 8-битный формат. В js-csv-кодировании csvContentEncoded используется для транскодирования:

Попытки использовать что-то подобное потерпели неудачу. Возможно, вам нужен какой-то хак, просто поставить windows-1251 недостаточно, так как js хранит в utf8, тогда скорее всего вам нужно добавить конвертацию в 1251 в самом конце. Часть кода: js-csv-кодировка.

var csvContent = 'текст',
textEncoder = new CustomTextEncoder('windows-1251', {NONSTANDARD_allowLegacyEncoding: true}),
fileName = 'some-data.csv';
var a = document.getElementById('download-csv');
a.addEventListener('click', function(e) {
var csvContentEncoded = textEncoder.encode([csvContent]);
var blob = new Blob([csvContentEncoded], {type: 'text/csv;charset=windows-1251;'});
saveAs(blob, fileName);
e.preventDefault();
});

Я также пытался использовать преобразования с использованием charcode, сохраняя не на сервер, а на компьютер, поэтому использование urlencode… не является правильным решением, потому что в этом случае мне приходится кодировать текст в читаемый.

Конечно, трудно найти решение не более 4000-5000 символов для букмарклета, и моих знаний недостаточно. Если есть решение с помощью других сценариев, например, перекодирование по таблице значений, это также может быть решением.

1 ответ

Я потратил половину дня, пытаясь сохранить файл XML с символами кириллицы в кодировке windows-1251. Оказалось, это довольно просто - вам просто нужно создать соответствующий байтовый массив. Смотрите пример ниже ( полное репо с этим примером):

import iconv from 'pika-iconv-lite';
import saveAs from 'save-as';

const byteArrayWin1251 = iconv.encode(
  `<?xml version="1.0" encoding="windows-1251"?>
  <note>
    <to>Михаил</to>
    <from>Андрей</from>
    <heading>Reminder</heading>
    <body>Вот такая вот xml! И сохранюсь я как win-1251</body>
  </note>`,
  'win1251'
);
const blob = new Blob([byteArrayWin1251], { type: 'application/xml;charset=windows-1251' })
saveAs(blob, 'myxml.xml');

Другие вопросы по тегам