JS Скачать файл в ANSI-кодировке (Windows-1251)

90
22 июня 2021, 14:00

Много вопросов было уже типа: "открываю файл с помощью <input type="file"/> и FileReader, а там значки ����� вместо русских букв"

Решение такого понятно:

var reader = new FileReader();
reader.readAsText(file, 'CP1251');

А КАК СДЕЛАТЬ НАОБОРОТ?

То есть

Есть текст на странице

Скачиваю его с помощью ссылки href="data:text/plain;charset:CP1251,ТЕКСТ_ДЛЯ_СКАЧИВАНИЯ"

Вот как нужно этот текст закодировать, чтобы он скачивался, а потом при его открытии бы "возникали значки ����� вместо русских букв"?

Ну и чтобы, естественно, его можно было бы декодировать потом нормально

Пример нужного скачиваемого файла с нужной кодировкой: файл

Пробовал делать так, используя эту библиотеку: windows-1251

var text = 'ТЕКСТ_ДЛЯ_СКАЧИВАНИЯ';    
a.setAttribute("href", "data:text/plain;charset:CP1251," + windows1251.encode(text));

- Не помогло

Answer 1

Нашел рабочий пример со словом привет

var a = document.createElement("a");
a.setAttribute("href", "data:text/plain;charset=cp1251,%EF%F0%E8%E2%E5%F2");
a.setAttribute("download", "Test.txt");
a.click();

И функцию, которая это слово декодирует

function decodeCP1251(string){
    function decodeChar(s, p) {
        var cp1251 = 'ЂЃ‚ѓ„…†‡€‰Љ‹ЊЌЋЏђ‘’“”•–—�™љ›њќћџ ЎўЈ¤Ґ¦§Ё©Є«¬*®Ї°±Ііґµ¶·\
ё№є»јЅѕїАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя';
        p = parseInt(p, 16);
        return p < 128 ? String.fromCharCode(p) : cp1251[p - 128];
    }
    var str = string;
    return str.replace(/%(..)/g,decodeChar);
}

Ну и судя по ней, кодирующая функция может выглядеть вот так

var encodeCP1251 = function (string) {
    function encodeChar(c) {
        var isKyr = function (str) {
            return /[а-я]/i.test(str);
        }
        var cp1251 = 'ЂЃ‚ѓ„…†‡€‰Љ‹ЊЌЋЏђ‘’“”•–—�™љ›њќћџ ЎўЈ¤Ґ¦§Ё©Є«¬*®Ї°±Ііґµ¶·\
ё№є»јЅѕїАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя'; 
        var p = isKyr(c) ? (cp1251.indexOf(c) + 128) : c.charCodeAt(0);
        var h = p.toString(16);
        if (h=='a'){
            h = '0A';
        }
        return '%' + h;
    }
    var res = '';
    for (var i = 0; i < string.length; i++) { 
        res += encodeChar(string.charAt(i)) //ну или string[i]
    }
    return res;
}

Переменная cp1251 ИМЕННО ТАКАЯ, КАК НАПИСАНО, С ТАКИМ ЖЕ ПЕРЕНОСОМ И Т.П.

Овнокодно, но работает)

var a = document.createElement("a");
a.setAttribute("href", "data:text/plain;charset=CP1251," + encodeCP1251('НУЖНЫЙ РУССКИЙ ТЕКСТ'));
a.setAttribute("download", "Test.txt");
a.click();

Тема закрыта)

READ ALSO
Не работает якорное меню

Не работает якорное меню

использую якорное меню на сайтеИспользую такой вот код

93
.on(&#39;click&#39; в .on(&#39;click&#39; как реализовать или чем заменить

.on('click' в .on('click' как реализовать или чем заменить

При нажатии на <div name="show_details_by_order" открывается <div id="order_body_ и стает доступно нажать на <a name="show_extended_details", но при нажатии на нее срабатывает...

93
Почему position: sticky в классе .header-top не работает?

Почему position: sticky в классе .header-top не работает?

Изучаю тему позиционирования элементов, застрял на позиции stickyПо задуму шапка сайта должна прилипнуть при скроле

90
Проблем погрузки классов при @import

Проблем погрузки классов при @import

Есть несколько страниц vue с одинаковыми классами стилейРешил перенести стили в один файл и подключать к каждой странице отдельно

74