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');