За последние 24 часа нас посетили 36760 программистов и 7744 робота. Сейчас ищут 1792 программиста ...

Проблема с кодировкой.

Тема в разделе "PHP для новичков", создана пользователем Sergey_k6, 19 янв 2023.

  1. Sergey_k6

    Sergey_k6 Новичок

    С нами с:
    28 май 2022
    Сообщения:
    32
    Симпатии:
    0
    Добрый день. Прошу помощи.
    Есть JS код, он работает и получает файлы предлагает их к загрузке
    Код (Javascript):
    1. $.post('.......Upload_file_for_client.php', {
    2.                         ID_user: user_ID,
    3.                       DownLoad: file.csv',
    4.                         observer: 'any'
    5.                    },function(data){
    6.                        console.log('data => '+data);
    7.                        if(/ здесь флажок, если что-то пошло не так /gi.test(data)) { return false; }
    8.                      
    9.                        let link = document.createElement('a');
    10.                        link.download = 'Report_statistick_stock.csv';
    11.                        let blob = new Blob([data], {type: 'application/vnd.ms-excel'});
    12.                        link.href = URL.createObjectURL(blob);
    13.                        link.click();
    14.                        URL.revokeObjectURL(link.href);
    15.                    });
    Проблема в том то как только в отдаваемом файле есть русские символы, мы получаем за место них в скачиваемом файле белебурду.
    И ещё мне бы хотелось отдельно получить наименование файла и его размер.

    Проблема в том что я не понимаю как его лучше отдать из PHP
    PHP:
    1. header("Pragma: public");
    2.      header("Expires: 0");
    3.      header('Content-Type: application/octet-stream');
    4.      header("Content-Disposition: attachment; filename=".$file_name."");
    5.      header("Content-Length: ".filesize($filename_path));
    6.      readfile($filename_path);
    7.      exit();
    Это код из PHP, кодировка файла cp1251
    Хотя по идее, она ни на что не должна влиять так как мы же файл отдаём.

    Сборка:
    PHP 5.6.1
    Windows NT WIN7HOMES 6.1 build 7601
    Ну и разумеется CP1251

    если вызывать PHP через открытие страницы, то всё ок
    Код (Javascript):
    1. var pi = jspsGetProgramInfo();
    2.  
    3.   if(pi.programName != "Microsoft Internet Explorer")
    4.  
    5.   { 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"); }
    6.  
    7.   else
    8.  
    9.   { window.open("……Upload_file_for_client.php?ID_user= user_ID &DownLoad= file.csv&observer=Microsoft Internet Explorer", "Загрузкаотчётапорасчёту"); }  
    И хотел ещё спросить у знатаков: А Blob вообще будет работать в IE?
    По уму это требование желательно оставить.

    Помогите пожалуйста решить проблему
     
  2. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.874
    Симпатии:
    753
    Адрес:
    Татарстан
    Л Боже.... Лет 10 всё крепко сидят на utf8
    С именами, да будет трабла, лучше переименовывать транслитерауией
     
  3. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.861
    Симпатии:
    656
  4. Sergey_k6

    Sergey_k6 Новичок

    С нами с:
    28 май 2022
    Сообщения:
    32
    Симпатии:
    0
    Я правильно понимаю, что вы предлагаете перекодировать передаваемый контент в utf-8?
    Это можно как-нибудь сделать средствами самого PHP?
    --- Добавлено ---
    iconv не работает.
    Всё равно белебурда приходит
     
  5. dantemgs

    dantemgs Новичок

    С нами с:
    24 дек 2022
    Сообщения:
    47
    Симпатии:
    9
    Есть еще convert_cyr_string()
     
  6. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.874
    Симпатии:
    753
    Адрес:
    Татарстан
    надо что все файлы PHP, JS, HTML сами были в кодировке utf8
    вы используете Jquery - он работает именно по utf8
     
  7. Sergey_k6

    Sergey_k6 Новичок

    С нами с:
    28 май 2022
    Сообщения:
    32
    Симпатии:
    0
    Сделал вот так вот.
    PHP:
    1.      $Content=file_get_contents($filename_path);
    2.      $Content=iconv("cp1251","utf-8",$Content);
    3.      file_put_contents($filename_path, $Content);
    В консоль начал приходить нормальный текст.
    Я его сохраняю в текстовый файл и там нормальный русский текст.
    Открываю этот файл с разметкой csv в excel
    Хрень. В чём проблема?

    файл ниже.
    Пробовал его перекодить этим:
    Код (Javascript):
    1.      function utf8_decode (aa) {
    2.          var bb = '', c = 0;
    3.          for (var i = 0; i < aa.length; i++) {
    4.            c = aa.charCodeAt(i);
    5.            if (c > 127) {
    6.              if (c > 1024) {
    7.                if (c == 1025) {
    8.                  c = 1016;
    9.                } else if (c == 1105) {
    10.                  c = 1032;
    11.                }
    12.                bb += String.fromCharCode(c - 848);
    13.              }
    14.            } else {
    15.              bb += aa.charAt(i);
    16.            }
    17.          }
    18.          return bb;
    19.        }
    затем сохранить в файл. Но нет!
    --- Добавлено ---
    Что нужно поставить в data
    чтобы это заработало:
    Код (Javascript):
    1. let blob = new Blob([data], {type: 'application/vnd.ms-excel'});
     

    Вложения:

  8. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.874
    Симпатии:
    753
    Адрес:
    Татарстан
    А эксель любит windows 1251 кодировку csv
     
  9. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.861
    Симпатии:
    656
    Я чет. подумал, что кириллица в имени была.
     
  10. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    Ему нужен BOM.
     
  11. Sergey_k6

    Sergey_k6 Новичок

    С нами с:
    28 май 2022
    Сообщения:
    32
    Симпатии:
    0
    Что нужно
    Ну вообще, да если загружать через открытие окна.
    Отлично работает.
    --- Добавлено ---
    Вопрос: а как добавить BOM по уму это же указатель с какой стороны читать байты в UTF
    PHP:
    1. $file_ya = fopen($_SESSION['Root_catalog']."Yandex/Yandex_Market_list_from_".$Table_name.".xml", "w");
    2.                 fwrite($file_ya, "\xEF\xBB\xBF", 3);
    3.                 fputs($file_ya, iconv("cp1251","utf-8",$Ya_catalog));
    4.                 fclose($file_ya);
    Вот так сохраняем yandex каталоги
    Проблем тоже не наблюдается.

    Но вот так не работает
    Код (Javascript):
    1. 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
     
  12. Sergey_k6

    Sergey_k6 Новичок

    С нами с:
    28 май 2022
    Сообщения:
    32
    Симпатии:
    0
    И ещё одно замечание
    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
    Есть идеи?
     
  13. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    @Sergey_k6, в #7 приложен файл Report_statistick_stock.txt
    Он уже содержит BOM.
    Если дать ему расширение csv, например - без проблем должен открыться в ms-excell (v. старше какой-то версии.... в 2018 - точно уже нужен был BOM)
     
  14. Sergey_k6

    Sergey_k6 Новичок

    С нами с:
    28 май 2022
    Сообщения:
    32
    Симпатии:
    0
    Нужно чтобы он открывался через 2007
    Суть не в этом внимательно почитайте начало.
    Код (Javascript):
    1. var pi = jspsGetProgramInfo();
    2.   if(pi.programName != "Microsoft Internet Explorer")
    3.   { 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"); }
    4.   else
    5.   { 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