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

1

Мне нужно решение с кодировкой utf для 8-разрядного cp1251 или cp1252 с использованием blob

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

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

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

Поэтому остается только версия маленького скрипта, написанного на собственном 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>

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

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

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 символов для букмарклета, и моих знаний недостаточно. Если есть решение с помощью других сценариев, например, перекодирование по таблице значений, это также может быть решением.

  • 0
    Зачем вам это нужно в букмарклет? Зачем вам нужно часто запускать этот букмарклет на сайте, где вы не можете отключить noscript?
  • 0
    Во-первых, сейчас любой сайт небезопасен. Недавние уязвимости в спектре и расплавлении могут дать возможность читать память даже с помощью скрипта js, не говоря уже об эксплойте браузера. Для многих решений требуется букмарклет, например, сохранение текста с сайта в обычный текстовый файл.
Показать ещё 2 комментария
Теги:
utf-8
encoding
cp1252
cp1251

1 ответ

0

Я потратил половину дня, пытаясь сохранить 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');

Ещё вопросы

Сообщество Overcoder
Наверх
Меню