Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Скачать текст в измененной кодировке (https://javascript.ru/forum/misc/78320-skachat-tekst-v-izmenennojj-kodirovke.html)

grigandal 26.08.2019 11:02

Скачать текст в измененной кодировке
 
Есть текст на странице

Хочу его скачать подобным способом

var a = document.createElement("a");
    a.setAttribute("href", "data:text/plain," + ('НУЖНЫЙ ТЕКСТ НА РУССКОМ'));
    a.setAttribute("download", "Test.kbs");
    a.click();


Но перед этим мне нужно преобразовать его кодировку в windows-1251

Пробовал использовать эту библиотеку: https://github.com/mathiasbynens/windows-1251

И сделать вот так

var a = document.createElement("a");
    a.setAttribute("href", "data:text/plain," + windows1251.encode('НУЖНЫЙ ТЕКСТ НА РУССКОМ'));
    a.setAttribute("download", "Test.kbs");
    a.click();

Но после того, как открываю скачанное в VS Code или NotePad++ и переоткрываю с учетом кодировки windows-1251 все равно остаются непонятные символы

Как правильно перекодировать текст?

grigandal 27.08.2019 12:40

Вот пример файла с нужной кодировкой

VS Code декодирует его с кодировкой Cyrillic (Windows 1251)

Без декодирования VS Code отображает этот файл так: �������� ����

После действия Reopen with encoding: Cyrillic (Windows-1251) отображается нормально: Тестовый файл

Aetae 27.08.2019 18:06

data:text/plain;cp1251,

grigandal 27.08.2019 21:47

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

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);
        return '%' + h;
    }
    var res = '';
    for (var i = 0; i < string.length; i++) { 
        res += encodeChar(string.charAt(i)) //ну или string[i]
    }
    return res;
}


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

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


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

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

grigandal 27.08.2019 21:49

Цитата:

Сообщение от Aetae (Сообщение 512249)
data:text/plain;cp1251,

Это не сильно поможет, это задает только мета тег, а должна быть закодирована сама строка


Часовой пояс GMT +3, время: 12:38.