Как сохранить .txt файл в Windows-1251 на JS?

Использую для сохранения файла FileSaver.js, в результате получается файл с кодировкой utf-8.

var blob = new Blob([text], { type: "text/plain; charset=windows-1251" });
saveAs(blob, 'file.txt');
  • Вопрос задан
  • 1743 просмотра
Решения вопроса 1
Kir_K
@Kir_K Автор вопроса
Дабы закрыть гештальт добавлю решение которое нашлось методом проб и ошибок. Может кому-то поможет избежать излишней траты времени на поиски как мне.

Итак, итоговый код из того самого проекта:

if (isIE) {
        var strResult = new TextEncoder('windows-1251', { NONSTANDARD_allowLegacyEncoding: true }).encode(txtData);
        safeSave('demirPayments.txt', strResult);
    } else {
        const encodedDataURL = windows1251.encodeURL(txtData);

        $('#LinkOnFile').attr('href', 'data:text/plain;charset=windows-1251,' + encodedDataURL);
        $('#LinkOnFile').find('span').trigger('click');
    };


Т.е. используется 2 разных метода для IE и для прочих платформ. Для IE после конвертации строки в нужную нам кодировку через TextEncoder используем следующую процедуру для сохранения файла, где пакуем файл как бинарные данные функцией saveAs из библиотеки FileSaver.js:

function safeSave(name, Data, PathLength) {//Data as array             
    // !Elem:LoadSaveDi
    var safeSaveLoad = 0;
    if (!PathLength) { PathLength = 100000; }
    var buffer = new ArrayBuffer(Data.length)
        , temp = new DataView(buffer)
        , n32 = Math.floor(Data.length / 4)
        , n16 = Math.floor((Data.length - n32 * 4) / 2)
        , n8 = Data.length - n32 * 4 - n16 * 2
        , Kkey = 0, K = -1
        , APath = splitPath(n32, PathLength)
        ;
    if (APath == '') { APath = [0] }

    var RunSasa = setInterval(function () {
        if (Kkey == 0) { Kkey = 1; K += 1; }
        for (var i = 0; i < APath[K]; i++) {
            temp.setUint32((i + K * PathLength) * 4, Data[(i + K * PathLength) * 4] * Math.pow(256, 3) + Data[(i + K * PathLength) * 4 + 1] * Math.pow(256, 2) + Data[(i + K * PathLength) * 4 + 2] * 256 + Data[(i + K * PathLength) * 4 + 3]);
        }
        Kkey = 0;
        safeSaveLoad = Math.round(1000 * (K + 1) / APath.length) / 1000;
        if (K + 1 == APath.length) {
            clearInterval(RunSasa);
            if (n16 != 0) { temp.setUint16(n32 * 4, Data[n32 * 4] * 256 + Data[n32 * 4 + 1]); }
            if (n8 != 0) { temp.setUint8(n32 * 4 + n16 * 2, Data[n32 * 4 + n16 * 2]); }
            saveAs(new Blob([buffer], { type: "binary" }), name);
        }
    }, 10);
}


Прочие браузеры работать по этой схеме отказались, как впрочем и по другим более менее тривиальным (список перепробованного не приведу, т.к. было это давно и возможно, что сейчас часть из них сработает на новых версиях браузерных движков).
Однако тогда пришлось имитировать ссылку и клик по ней:

$('#LinkOnFile').attr('href', 'data:text/plain;charset=windows-1251,' + encodedDataURL);
$('#LinkOnFile').find('span').trigger('click');


Только так удалось получить нужный формат файла.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
07 мая 2024, в 13:07
7000 руб./за проект
07 мая 2024, в 12:59
500 руб./за проект
07 мая 2024, в 12:58
25000 руб./за проект