Добрый день. Прошу помощи. Есть JS код, он работает и получает файлы предлагает их к загрузке Код (Javascript): $.post('.......Upload_file_for_client.php', { ID_user: user_ID, DownLoad: file.csv', observer: 'any' },function(data){ console.log('data => '+data); if(/ здесь флажок, если что-то пошло не так /gi.test(data)) { return false; } let link = document.createElement('a'); link.download = 'Report_statistick_stock.csv'; let blob = new Blob([data], {type: 'application/vnd.ms-excel'}); link.href = URL.createObjectURL(blob); link.click(); URL.revokeObjectURL(link.href); }); Проблема в том то как только в отдаваемом файле есть русские символы, мы получаем за место них в скачиваемом файле белебурду. И ещё мне бы хотелось отдельно получить наименование файла и его размер. Проблема в том что я не понимаю как его лучше отдать из PHP PHP: header("Pragma: public"); header("Expires: 0"); header('Content-Type: application/octet-stream'); header("Content-Disposition: attachment; filename=".$file_name.""); header("Content-Length: ".filesize($filename_path)); readfile($filename_path); exit(); Это код из PHP, кодировка файла cp1251 Хотя по идее, она ни на что не должна влиять так как мы же файл отдаём. Сборка: PHP 5.6.1 Windows NT WIN7HOMES 6.1 build 7601 Ну и разумеется CP1251 если вызывать PHP через открытие страницы, то всё ок Код (Javascript): var pi = jspsGetProgramInfo(); if(pi.programName != "Microsoft Internet Explorer") { window.open("……Upload_file_for_client.php?ID_user=user_ID&DownLoad=file.csv&observer=not", "Загрузкаотчётапорасчёту", "width=820, height=750, screenX=200, screenY=200, toolbar=0, location=0, directories=0, status=0"); } else { window.open("……Upload_file_for_client.php?ID_user= user_ID &DownLoad= file.csv&observer=Microsoft Internet Explorer", "Загрузкаотчётапорасчёту"); } И хотел ещё спросить у знатаков: А Blob вообще будет работать в IE? По уму это требование желательно оставить. Помогите пожалуйста решить проблему
Л Боже.... Лет 10 всё крепко сидят на utf8 С именами, да будет трабла, лучше переименовывать транслитерауией
Я правильно понимаю, что вы предлагаете перекодировать передаваемый контент в utf-8? Это можно как-нибудь сделать средствами самого PHP? --- Добавлено --- iconv не работает. Всё равно белебурда приходит
надо что все файлы PHP, JS, HTML сами были в кодировке utf8 вы используете Jquery - он работает именно по utf8
Сделал вот так вот. PHP: $Content=file_get_contents($filename_path); $Content=iconv("cp1251","utf-8",$Content); file_put_contents($filename_path, $Content); В консоль начал приходить нормальный текст. Я его сохраняю в текстовый файл и там нормальный русский текст. Открываю этот файл с разметкой csv в excel Хрень. В чём проблема? файл ниже. Пробовал его перекодить этим: Код (Javascript): function utf8_decode (aa) { var bb = '', c = 0; for (var i = 0; i < aa.length; i++) { c = aa.charCodeAt(i); if (c > 127) { if (c > 1024) { if (c == 1025) { c = 1016; } else if (c == 1105) { c = 1032; } bb += String.fromCharCode(c - 848); } } else { bb += aa.charAt(i); } } return bb; } затем сохранить в файл. Но нет! --- Добавлено --- Что нужно поставить в data чтобы это заработало: Код (Javascript): let blob = new Blob([data], {type: 'application/vnd.ms-excel'});
Что нужно Ну вообще, да если загружать через открытие окна. Отлично работает. --- Добавлено --- Вопрос: а как добавить BOM по уму это же указатель с какой стороны читать байты в UTF PHP: $file_ya = fopen($_SESSION['Root_catalog']."Yandex/Yandex_Market_list_from_".$Table_name.".xml", "w"); fwrite($file_ya, "\xEF\xBB\xBF", 3); fputs($file_ya, iconv("cp1251","utf-8",$Ya_catalog)); fclose($file_ya); Вот так сохраняем yandex каталоги Проблем тоже не наблюдается. Но вот так не работает Код (Javascript): let blob = new Blob(['\xEF\xBB\xBF'+data], {type: 'application/vnd.ms-excel'}); --- Добавлено ---И если я правильно понимаю то это уже проблема в самом Excel https://stackoverflow.com/questions/50130605/python-2-7-csv-file-read-write-xef-xbb-xbf-code
И ещё одно замечание https://lumpics.ru/how-to-change-encoding-in-excel/?ysclid=ld63cefm7w50846437 Если открыть файл notepad++ то кодировку определяет UTF-8-BOM А вот если его в notepad++ перекодировать в cp1251 то мы получим именно ту белибурду которая отображается в excel Следовательно: по умолчанию excel пытается открыть файл в cp1251 и из-за этого проблема. Так как excel поломать мы не можем, ВОПРОС: Как средствами JavaScript поменять кодировку с UTF-8-BOM на cp1251 Есть идеи?
@Sergey_k6, в #7 приложен файл Report_statistick_stock.txt Он уже содержит BOM. Если дать ему расширение csv, например - без проблем должен открыться в ms-excell (v. старше какой-то версии.... в 2018 - точно уже нужен был BOM)
Нужно чтобы он открывался через 2007 Суть не в этом внимательно почитайте начало. Код (Javascript): var pi = jspsGetProgramInfo(); if(pi.programName != "Microsoft Internet Explorer") { window.open("……Upload_file_for_client.php?ID_user=user_ID&DownLoad=file.csv&observer=not", "Загрузкаотчётапорасчёту", "width=820, height=750, screenX=200, screenY=200, toolbar=0, location=0, directories=0, status=0"); } else { window.open("……Upload_file_for_client.php?ID_user= user_ID &DownLoad= file.csv&observer=Microsoft Internet Explorer", "Загрузкаотчётапорасчёту"); } При загрузке этим методом всё открывается нормально ВНИМАНИЕ! ПОЧЕМУ!!! Давайте разберёмся в чём разница! Почему с Blod наблюдаются такие проблемы что я упустил! Вот что мне интересно а не 2018 excel впахивать на 70-80 машин! --- Добавлено --- В принципе я думаю что надо попробовать через. Думаю что надо попробовать через кодирование всё-таки cp1251 https://www.design-sites.ru/utility/url-encoding.php?ysclid=ld6bj6d8pv800430286