Форум программистов, компьютерный форум, киберфорум
JavaScript для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.52/21: Рейтинг темы: голосов - 21, средняя оценка - 4.52
6 / 5 / 3
Регистрация: 16.01.2016
Сообщений: 255

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

26.08.2019, 10:38. Показов 4629. Ответов 10

Студворк — интернет-сервис помощи студентам
Есть текст на странице

Хочу его скачать подобным способом
JavaScript
1
2
3
4
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

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

JavaScript
1
2
3
4
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 все равно остаются непонятные символы

Как правильно перекодировать текст?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
26.08.2019, 10:38
Ответы с готовыми решениями:

Вывод текста в кодировке Win-1251 из bat-файла, текст которого в кодировке OEM-866
примем за аксиому утверждение: "bat-скрипт следует создавать в кодировке DOS (OEM-866)" ...пусть в скрипте есть код, который...

Текст отображается в неверной кодировке

Записать текст в другой кодировке
Прочитать текст из файла в одной кодировке, а потом записать в другой файл в другой кодировке. Имя первого файла и две кодировки передаются...

10
6 / 5 / 3
Регистрация: 16.01.2016
Сообщений: 255
27.08.2019, 11:36  [ТС]
Вот в какой кодировке мне нужно скачать файл
VS Code определяет ее как windows-1251

В файле написано
Code
1
Тестовый файл
При просмотре его как в кодировке UTF-8 там отображаются знаки вопроса
Code
1
�������� ����
Вложения
Тип файла: txt Test.txt (13 байт, 11 просмотров)
0
6 / 5 / 3
Регистрация: 16.01.2016
Сообщений: 255
27.08.2019, 11:49  [ТС]
Цитата Сообщение от grigandal1580 Посмотреть сообщение
Вложения
Test.txt (13 байт, 1 просмотров)
Цитата Сообщение от grigandal1580 Посмотреть сообщение
VS Code определяет ее как windows-1251
Однако при попытке декодировать вот так

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
var s; 
var fileInput = document.createElement('input');
        fileInput.type = 'file';
 
        fileInput.oninput = function () {
            var file = fileInput.files[0];
 
            var reader = new FileReader();
            reader.onload = function (e) {
                s = (e.target.result);
            };
            reader.readAsText(file);
        }
        fileInput.click();//Здесь выбрал этот файл
JavaScript
1
console.log(s)
Результат: "�������� ����"

JavaScript
1
2
var uint8array = (new TextEncoder().encode(s));
var string = new TextDecoder('windows-1251').decode(uint8array);
В переменной string оказывается такая ерунда
JavaScript
1
console.log(string);//"пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅ"
То есть, похоже, декодируется не то, что скрывается за символом �, а сам символ � (и декодируется как пїЅ)
0
1741 / 913 / 480
Регистрация: 05.12.2013
Сообщений: 3,074
27.08.2019, 12:59
Вроде так

JavaScript
1
 reader.readAsText(file, 'CP1251');
1
6 / 5 / 3
Регистрация: 16.01.2016
Сообщений: 255
27.08.2019, 13:16  [ТС]
ТабуретY,
Цитата Сообщение от ТабуретY Посмотреть сообщение
Вроде так
Загрузилось нормально

А как теперь скачать файл в этой кодировке с помощью "data:text/plain, + текст"?

Добавлено через 12 минут
ТабуретY, То есть, мне нужно скачать файл с кодировкой CP1251, чтобы потом при его загрузке отображались эти знаки вопроса (�)
Ну и естественно, чтобы этот файл можно было декодировать))
0
1741 / 913 / 480
Регистрация: 05.12.2013
Сообщений: 3,074
27.08.2019, 13:23
Цитата Сообщение от grigandal1580 Посмотреть сообщение
То есть, мне нужно скачать файл с кодировкой CP1251
Вроде ссылку надо так формировать

JavaScript
1
var url = "data:text/plain;charset=CP1251," + encodeURIComponent(str);
0
6 / 5 / 3
Регистрация: 16.01.2016
Сообщений: 255
27.08.2019, 13:36  [ТС]
Цитата Сообщение от ТабуретY Посмотреть сообщение
Вроде ссылку надо так формировать
Неа, это задает только мета-тег, а он ничего сам по себе не перекодирует
Сама строка str должна иметь кодировку CP1251, а в js она по умолчанию в юникоде, а точнее, если не ошибаюсь, в UTF-16
Я уже писал, что пытался ее закодировать так (с помощью библиотеки):
JavaScript
1
2
3
4
var a = document.createElement("a");
a.setAttribute("href", "data:text/plain," + windows1251.encode('НУЖНЫЙ ТЕКСТ НА РУССКОМ'));
a.setAttribute("download", "Test.kbs");
a.click();
И добавление charset в таком виде и тут тоже ничего не изменяет
Проверено:

JavaScript
1
2
3
4
var a = document.createElement("a");
a.setAttribute("href", "data:text/plain;charset=CP1251," + windows1251.encode('НУЖНЫЙ ТЕКСТ НА РУССКОМ'));
a.setAttribute("download", "Test.kbs");
a.click();
JavaScript
1
2
3
4
var a = document.createElement("a");
a.setAttribute("href", "data:text/plain;charset=CP1251," + ('НУЖНЫЙ ТЕКСТ НА РУССКОМ'));
a.setAttribute("download", "Test.kbs");
a.click();
Все равно в первом случае скачивается с кодировкой не такой, как в примере, прикрепленном выше
А во втором случае в UTF-8 вообще

Добавлено через 4 минуты
А нужно так)
Цитата Сообщение от grigandal1580 Посмотреть сообщение
мне нужно скачать файл с кодировкой CP1251, чтобы потом при его загрузке отображались эти знаки вопроса (�)
Ну и естественно, чтобы этот файл можно было декодировать))
0
1741 / 913 / 480
Регистрация: 05.12.2013
Сообщений: 3,074
27.08.2019, 14:30
Цитата Сообщение от grigandal1580 Посмотреть сообщение
И добавление charset в таком виде и тут тоже ничего не изменяет
Проверено:
Выделить код
var a = document.createElement("a");
a.setAttribute("href", "data:text/plain;charset=CP1251," + windows1251.encode('НУЖНЫЙ ТЕКСТ НА РУССКОМ'));
a.setAttribute("download", "Test.kbs");
a.click();

Примеры не совсем корректные, дело в том, что записанная строка уже имеет кодировку файла, utf-8 скорее всего, нужно попробовать отправить строку полученную отсюда
JavaScript
1
reader.readAsText(file, 'CP1251');
, так как она именно в кодировке win 1251
0
6 / 5 / 3
Регистрация: 16.01.2016
Сообщений: 255
27.08.2019, 17:15  [ТС]
Цитата Сообщение от ТабуретY Посмотреть сообщение
нужно попробовать отправить строку полученную отсюда
JavascriptВыделить код
1
reader.readAsText(file, 'CP1251');
Попробовал

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
var s; 
var fileInput = document.createElement('input');
        fileInput.type = 'file';
 
        fileInput.oninput = function () {
            var file = fileInput.files[0];
 
            var reader = new FileReader();
            reader.onload = function (e) {
                s = (e.target.result);
            };
            reader.readAsText(file, 'CP1251');
        }
        fileInput.click();
потом так

JavaScript
1
2
3
4
var a = document.createElement("a");
a.setAttribute("href", "data:text/plain;charset=CP1251," + (s));
a.setAttribute("download", "Test.txt");
a.click();
Открываю файл в VS Code - его кодировка UTF-8, все символы считываются нормально

Так что скорее всего строка, полученная из reader.readAsText(...) уже преобразуется в юникод

Добавлено через 2 минуты
windows1251.encode естественно тоже не помог)

Добавлено через 2 часа 15 минут
ТабуретY,
Вот рабочий пример для слова "привет"



JavaScript
1
2
3
4
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();
Плюс такая деталь, что например
JavaScript
1
decodeURIComponent('%EF%F0%E8%E2%E5%F2')
Не работает
Но при этом файл со словом "привет" в нужной мне кодировке сохраняется

Добавлено через 6 минут
И вот функция декодирования

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

Осталось дело за малым, сделать обратную функцию)

Добавлено через 9 минут
точнее, функция такая, та - только один символ декодирует

JavaScript
1
2
3
4
5
6
7
8
9
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);
}
Только cp1251 = 'ЂЃ‚ѓ„…†‡€‰Љ‹ЊЌЋЏђ‘’“”•–—�™љ›њќћџ ЎўЈ¤Ґ¦§Ё©Є«¬*®Ї°±Ііґµ¶·\
ё№є»јЅѕїАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ абвгдежзийклмнопрстуфхцчшщъыьэюя';
(в коде немного неправильно отображается)

Осталось дело за малым, сделать обратную функцию)
0
1741 / 913 / 480
Регистрация: 05.12.2013
Сообщений: 3,074
27.08.2019, 17:31
Цитата Сообщение от grigandal1580 Посмотреть сообщение
Осталось дело за малым, сделать обратную функцию)
А зачем обратная? Ведь загружается файл в win1251?
0
6 / 5 / 3
Регистрация: 16.01.2016
Сообщений: 255
27.08.2019, 18:10  [ТС]
В итоге вот две функции, которыми можно туда-сюда гонять)

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
function decodeCP1251(string){
    function decodeChar(s, p) {
        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;
}
Неверно-отображенная переменная такая:

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


Именно так, с переносом

Все, тема закрыта)

Добавлено через 27 минут
Цитата Сообщение от ТабуретY Посмотреть сообщение
Ведь загружается файл в win1251?
После того, как мы его кладем в строку, текст файла в строке становится в юникоде
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.08.2019, 18:10
Помогаю со студенческими работами здесь

Как вывести из БД текст в нужной кодировке ?
как вывести из БД в нормальной кодировке ? в php прописал mysql_query(&quot;SET NAMES utf8&quot;); вот БД CREATE TABLE IF NOT EXISTS...

Как вывести текст в правильной кодировке
.386p data segment para public 'data' use16 message db 'Привет$' data ends stk segment para stack 'stk' use16 db 100h...

В TextBox выводится текст в неправильной кодировке
Среда Visual Basic STUDIO’2010 Professional Что сделать, чтобы в элемент управления TextBox выводилась кириллица? Выводится...

Функция gets() возвращает текст в неправильной кодировке
Здравствуйте. Подскажите пожалуйста, что с этим можно сделать... Здесь, текст который будет введен в строке &quot;Введите строку: &quot;...

Как привести текст к единой кодировке?
В массиве элементы содержат текст, цифры и служебные знаки (тире, точка, # и т.п.). Нюанс в том, что текст в одних ячейках массива...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru