Как я могу вывести CSV-файл UTF-8 на PHP, который Excel будет правильно читать?

У меня есть очень простая вещь, которая просто выводит некоторые данные в формате CSV, но это должен быть UTF-8. Я открываю этот файл в TextEdit, TextMate или Dreamweaver, и он правильно отображает символы UTF-8, но если я открою его в Excel, он будет делать такие глупые вещи. Вот что у меня во главе моего документа:

header("content-type:application/csv;charset=UTF-8");
header("Content-Disposition:attachment;filename=\"CHS.csv\"");

Кажется, все это дает желаемый эффект, за исключением того, что Excel (Mac, 2008) не хочет импортировать его должным образом. В Excel нет возможности «открыть как UTF-8» или что-то в этом роде, так что… я немного раздражаюсь.

Кажется, я нигде не могу найти четких решений для этого, несмотря на то, что у многих людей есть такая же проблема. Больше всего я вижу включение спецификации, но я не могу точно понять, как это сделать. Как вы можете видеть выше, я просто echo обрабатываю эти данные, я не пишу никаких файлов. Я могу сделать это, если мне нужно, я просто не потому, что на данный момент в этом нет необходимости. Любая помощь?

Обновление: я попытался повторить спецификацию как echo pack("CCC", 0xef, 0xbb, 0xbf);, которую я только что взял с сайта, который пытался обнаружить спецификацию. Но Excel просто добавляет эти три символа в самую первую ячейку при импорте и по-прежнему путает специальные символы.


person Ben Saufley    schedule 03.12.2010    source источник
comment
В Excel нет возможности настроить набор символов входящего файла? Вы уверены в этом на 100%? У меня нет под рукой копии, поэтому я не могу попробовать, но я полагаю, что где-то должен быть раскрывающийся список.   -  person Pekka    schedule 03.12.2010
comment
Это Excel на Mac - он кажется более ограниченным, чем Excel на ПК. В диалоговом окне «Открыть» нет раскрывающихся списков, кроме того, какие типы файлов можно открывать. Я везде искал. Если это есть, то непонятно. Я бы сказал, что уверен на 98%.   -  person Ben Saufley    schedule 03.12.2010
comment
Офис Microsoft или openoffice?   -  person ajreal    schedule 03.12.2010
comment
Microsoft лучше в этом отношении, я не нашел способа заставить OpenOffice обнаруживать кодировку, даже BOM. Слей это.   -  person Ciantic    schedule 15.08.2012
comment
Спецификация также не влияет на Microsoft Excel 2008 для Mac.   -  person Ben Saufley    schedule 15.08.2012


Ответы (25)


Процитировать инженер службы поддержки Microsoft,

Excel для Mac в настоящее время не поддерживает UTF-8

Обновление, 2017 г.: это верно для всех версий Microsoft Excel для Mac до Office 2016. Более новые версии (из Office 365) теперь поддерживают UTF-8.

Чтобы вывести содержимое UTF-8, которое Excel как в Windows, так и в OS X сможет успешно прочитать, вам нужно будет сделать две вещи:

  1. Убедитесь, что вы преобразовали текст CSV из UTF-8 в UTF-16LE.

    mb_convert_encoding($csv, 'UTF-16LE', 'UTF-8');
    
  2. Убедитесь, что вы добавили знак порядка байтов UTF-16LE в начало файл

    chr(255) . chr(254)
    

Следующая проблема, которая появляется только с Excel в OS X (но не Windows), будет при просмотре файла CSV со значениями, разделенными запятыми, Excel будет отображать строки только с одной строкой и весь текст вместе с запятые в первой строке.

Чтобы избежать этого, используйте табуляцию в качестве отдельного значения.

Я использовал эту функцию из комментариев PHP (с помощью вкладок "\ t" вместо запятых), и он отлично работал в OS X и Windows Excel.

Обратите внимание, что для устранения проблемы с пустым столбцом в конце строки мне пришлось изменить строку кода, в которой говорится:

    $field_cnt = count($fields);

to

    $field_cnt = count($fields)-1;

Как говорится в некоторых других комментариях на этой странице, другие приложения для работы с электронными таблицами, такие как OpenOffice Calc, Apple Numbers и Google Doc Spreadsheet, не имеют проблем с файлами UTF-8 с запятыми.

См. таблицу в этом вопросе, чтобы узнать, что работает и не работает для файлов CSV Unicode в Excel.


В качестве примечания я мог бы добавить, что если вы используете Composer, вам следует взглянуть на добавление _ 5_ в соответствии с вашими требованиями. League\Csv имеет действительно хороший API для создания файлов CSV.

Чтобы использовать League\Csv с этим методом создания файлов CSV, просмотрите этот пример.

person Tim Groeneveld    schedule 27.05.2013
comment
Назовите меня глупым, но я не могу заставить это работать. Я преобразовал свои данные с помощью функции mb_convert_encoding и вывел спецификацию, предшествующую содержимому файла, но я получаю только одну строку китайских символов, когда открываю файл в Excel. Я все еще использую запятые, а не табуляции, но, по-видимому, это не должно вызывать того, что я вижу. - person John Rix; 12.08.2014
comment
@JohnRix, это странно. Этот код буквально решил все проблемы, с которыми я когда-либо сталкивался при экспорте файлов CSV, за исключением импортеров, которые принимают только запятые. Не могли бы вы прислать мне pastebin кода, который вы используете, вместе с массивом, который вы превращаете в CSV, и копией экспортированного файла? - person Tim Groeneveld; 12.08.2014
comment
Это решение также решило проблему UTF8 для меня на Mac и Windows. Я также обнаружил, что добавление строки с sep=; или sep=, в файл CSV сообщает Excel, как разделен CSV, и столбцы будут снова созданы правильно. - person Luc Wollants; 13.11.2014
comment
Я обнаружил, что все получилось неправильно, если я начал строку как просто спецификацию, затем в другой строке добавил "sep=,\n", а затем в другую строку добавил данные. Все было хорошо, если бы я делал все в одну строчку ($csv = chr(255) . chr(254) /* BOM */ . "sep=,\n" . mb_convert_encoding($csv, 'UTF-16LE', 'UTF-8');). Теперь все выглядит отлично на Mac. У меня нет Windows для тестирования. - person tremby; 24.12.2014
comment
Единственное, что у меня полностью сработало. Непоследовательность Microsoft не перестает меня удивлять. В качестве разделителя используется обычный CSV-файл, но если есть спецификация, он по какой-то причине сохраняется с использованием \ t. C в .csv означает ЗАПЯТАЯ, черт возьми. Это действительно несложно. - person Phil; 20.10.2015
comment
Это было единственным решением для правильного отображения Š. - person Riho; 15.02.2016
comment
Кажется, это работает для excel ‹= 2010, но не работает для более новых версий MSExcel - person Aous1000; 08.08.2016
comment
В моем Excel Mac 2011 размещение chr (255) .chr (254) в начале файла превращает все символы в китайский (или корейский, разницы не видно). Единственное решение, которое сработало для меня, было то, что использовало iconv - person Christer Fernstrom; 19.09.2016
comment
Предоставленное решение в основном правильное, НО: UTF-16LE = FE FF = chr (254). chr (255) UTF-16BE = FF FE = chr (255). chr (254) Вы просто смешали BE (Big Endian) и LE (Little Endian). Поэтому, если вы хотите использовать UTF-16LE, возьмите chr (254). chr (255) для спецификации. - person Spears; 22.08.2017
comment
Excel для Mac в настоящее время не поддерживает UTF-8. Это больше не действует. В Excel для Mac версии 15 содержимое UTF-8 отображается правильно (т.е. нет необходимости преобразовывать в UTF-16LE) - person Raptor; 20.10.2017
comment
Для тех, у кого возникла проблема: китайские символы появляются, когда символы не закодированы с использованием mb_convert_encoding() (или iconv()) - person PaulH; 26.10.2018
comment
Чтобы прояснить шаг 2 - метка порядка байтов (BOM) UTF-16LE должна появиться в начале файла и может быть создана в PHP с помощью команды echo "\xFF\xFE"; - person Tim Rogers; 06.01.2019

У меня такая же (или похожая) проблема.

В моем случае, если я добавлю спецификацию к выходу, она будет работать:

header('Content-Encoding: UTF-8');
header('Content-type: text/csv; charset=UTF-8');
header('Content-Disposition: attachment; filename=Customers_Export.csv');
echo "\xEF\xBB\xBF"; // UTF-8 BOM

Я считаю, что это довольно уродливый прием, но он сработал для меня, по крайней мере, для Excel 2007 Windows. Не уверен, что это будет работать на Mac.

person Daniel Magliola    schedule 14.12.2010
comment
Уродливо, но очень полезно. Спасибо. - person abelito; 27.11.2011
comment
Я почти уверен, что это вообще не работает в OS X, к сожалению. Я думаю, что он может отображать спецификацию при импорте (предупреждение: туманные воспоминания). - person davidtbernal; 31.01.2012
comment
Это правильно. По крайней мере, я попытался добавить спецификацию, как в приведенном выше примере, но он действительно просто показывал некоторые фанковые символы в начале и продолжал отображать специальные символы неправильно (проверено в Excel 2011). Мне показалось, что это лучше всего работает при любых настройках: stackoverflow.com/a/1648671/1005334 (с использованием PHP). - person kasimir; 20.03.2012
comment
Я продолжаю получать предупреждения по этому вопросу, потому что, очевидно, многие другие люди натыкаются на него. Хотел бы я отметить это как правильное, потому что за него много проголосовали. К сожалению, я наконец-то попробовал это решение (давно отказался от этого проекта), и оно не работает для меня в Excel 2008 для Mac. Рад, что это работает на вас. Я поддержал решение. Но это не решает проблему Excel для Mac 2008. Если кому-то повезет с Mac, обязательно дайте мне (и, очевидно, всем) знать. - person Ben Saufley; 01.06.2012
comment
Прекрасно работает при выводе файла CSV в MS Excel Starter 2010. Большое спасибо! - person Jamie Dexter; 07.02.2013
comment
Спасибо, Даниэль, это помогло моей проблеме, над которой я работал всю неделю, это спасительное решение :). - person Altaf Hussain; 08.06.2013
comment
У меня была эта проблема ... поэтому я попробовал это решение. Я сбросил спецификацию, и она работала в блокноте и т. Д., Но в Excel она взорвалась. так что я положил его обратно в обезоруживающую улыбку - person Damon; 25.04.2014
comment
Это не работает правильно в Excel для Mac. Единственный способ заставить его работать с этим - использовать решение UTF-16LE, см. Ниже. - person Ellert van Koperen; 05.12.2014
comment
Это только правильно открывается. При сохранении microsoft преобразует в файл переменных, разделенных табуляцией, что очень раздражает. - person Phil; 20.10.2015
comment
@daniel, можете ли вы однажды проверить мой вопрос здесь: stackoverflow.com/questions/38929492/ - person Hola; 14.08.2016
comment
День спасен .. Спасибо - person Chanaka Karunarathne; 23.08.2017
comment
Это также работает для меня в LibreOffice 5.1.6.2 / Ubuntu - person Fabien Quatravaux; 30.11.2017
comment
У меня работает на macOS с Excel 2016 (v16.15). - person Tim; 01.08.2018
comment
Я не думаю, что заголовок Content-Encoding следует использовать для обозначения кодировки. Скорее о сжатии: developer.mozilla.org/en -US / docs / Web / HTTP / Headers / - person Márton Tamás; 29.10.2018
comment
Похоже, старый трюк с UTF-8 BOM всегда работает! Благодарность! - person talsibony; 26.02.2019
comment
Год 2020 echo \ xEF \ xBB \ xBF; // UTF-8 BOM Все еще крут .. Я пробовал явное кодирование, перевод mbr и тратил много времени .. эта простая строка исправила мой CSV. Спасибо! - person nmorell; 24.09.2020
comment
Заголовки не позволяют открыть его из ~ / Downloads - person Galvani; 01.04.2021

Вот как я это сделал (чтобы побудить браузер загрузить файл csv):

header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=file.csv');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
echo "\xEF\xBB\xBF"; // UTF-8 BOM
echo $csv_file_content;
exit();

Единственное, что он исправил проблему с кодировкой UTF8 в предварительном просмотре CSV, когда вы нажимаете клавишу пробела на Mac ... но не в Excel Mac 2008 ... не знаю, почему

person Jazzer    schedule 29.09.2011
comment
Строка спецификации UTF-8 кода спасает меня с экспортом в xls - person Mladen Janjetovic; 28.03.2014
comment
Я искал способ вывода непосредственно в браузер как utf8, когда я наткнулся на этот пост. Вот мое решение с указанием этого сообщения для спецификации и бинарного заголовка передачи. $outstream = fopen( "php://output", 'w' ); fputs( $outstream, "\xEF\xBB\xBF" ); foreach ( $export as $fields ) { fputcsv( $outstream, $fields ); } fclose( $outstream ); - person Will B.; 15.05.2014
comment
Опечатка - убрать двойной )). - person sitilge; 02.06.2015

В моем случае очень приятно сделать CSV-файл с символами UTF-8, правильно отображаемыми в Excel.

$out = fopen('php://output', 'w');
fprintf($out, chr(0xEF).chr(0xBB).chr(0xBF));
fputcsv($out, $some_csv_strings);

Заголовок 0xEF 0xBB 0xBF BOM позволит Excel узнать правильную кодировку.

person Codemole    schedule 26.12.2017
comment
Большой для тебя брат ‹3 - person Adrien G; 26.11.2018
comment
fprintf($out, chr(0xEF).chr(0xBB).chr(0xBF)); ‹- это именно то, что мне нужно. Работает как часы. - person Alex; 16.07.2019
comment
спасибо, чувак, этот просто отлично работал, а другие решения - нет. - person spetsnaz; 02.12.2020
comment
спасибо, работает отлично! - person Michael Mulik; 23.02.2021

Я только что столкнулся с той же проблемой и нашел два решения.

  1. Используйте класс PHPExcel как было предложено bpeterson76.

    • Using this class generates the most widely compatible file, I was able to generate a file from UTF-8 encoded data that opened fine in Excel 2008 Mac, Excel 2007 Windows, and Google Docs.
    • Самая большая проблема с использованием PHPExcel заключается в том, что он медленный и использует много памяти, что не является проблемой для файлов разумного размера, но если ваш файл Excel / CSV содержит сотни или тысячи строк, эта библиотека становится непригодной для использования < / сильный>.
    • Вот метод PHP, который принимает некоторые данные TSV и выводит файл Excel в браузер, обратите внимание, что он использует Excel5 Writer, что означает, что файл должен быть совместим со старыми версиями Excel, но у меня больше нет доступа к ним, поэтому я не могу их проверить.

      function excel_export($tsv_data, $filename) {
          $export_data = preg_split("/\n/", $tsv_data);
          foreach($export_data as &$row) {
              $row = preg_split("/\t/", $row);
          }
      
          include("includes/PHPExcel.php");
          include('includes/PHPExcel/Writer/Excel5.php');
      
          $objPHPExcel = new PHPExcel();          
      
          $objPHPExcel->setActiveSheetIndex(0);
          $sheet = $objPHPExcel->getActiveSheet();
          $row = '1';
          $col = "A";
          foreach($export_data as $row_cells) {
              if(!is_array($row_cells)) { continue; }
                  foreach($row_cells as $cell) {
                      $sheet->setCellValue($col.$row, $cell);
                      $col++;
                  }
              $row += 1;
              $col = "A";
          }
      
          $objWriter = new PHPExcel_Writer_Excel5($objPHPExcel);
          header('Content-Type: application/vnd.ms-excel');
          header('Content-Disposition: attachment;filename="'.$filename.'.xls"');
          header('Cache-Control: max-age=0');
          $objWriter->save('php://output');   
          exit;   
      }
      
  2. Из-за проблем с эффективностью PHPExcel мне также пришлось выяснить, как создать файл CSV или TSV, совместимый с UTF-8 и Excel.

    • The best I could come up with was a file that was compatible with Excel 2008 Mac, and Excel 2007 PC, but not Google Docs, which is good enough for my application.
    • Я нашел решение здесь, в частности, этот ответ, но вы также должны прочитать принятый ответ, поскольку он объясняет проблему.
    • Вот код PHP, который я использовал, обратите внимание, что я использую данные tsv (вкладки в качестве разделителей вместо запятых):

      header ( 'HTTP/1.1 200 OK' );
      header ( 'Date: ' . date ( 'D M j G:i:s T Y' ) );
      header ( 'Last-Modified: ' . date ( 'D M j G:i:s T Y' ) );
      header ( 'Content-Type: application/vnd.ms-excel') ;
      header ( 'Content-Disposition: attachment;filename=export.csv' );
      print chr(255) . chr(254) . mb_convert_encoding($tsv_data, 'UTF-16LE', 'UTF-8');
      exit;
      
person Jasdeep Gosal    schedule 21.01.2011
comment
Я столкнулся с той же проблемой в Windows-7 Excel 2007 и попробовал все предложения, но не смог :( - person PHP Ferrari; 23.11.2012
comment
Решение UTF-16LE - это то, что сработало. Обратите внимание, что вы должны правильно отформатировать tsv, и это должно быть tsc, поэтому с разделителями табуляции, а не запятыми. См. Также сообщение Марка здесь: stackoverflow.com/a/1648671/1697370 - person Ellert van Koperen; 05.12.2014

У меня была такая же проблема, и она была решена, как показано ниже:

    header('Content-Encoding: UTF-8');
    header('Content-Type: text/csv; charset=utf-8' );
    header(sprintf( 'Content-Disposition: attachment; filename=my-csv-%s.csv', date( 'dmY-His' ) ) );
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');

    $df = fopen( 'php://output', 'w' );

    //This line is important:
    fputs( $df, "\xEF\xBB\xBF" ); // UTF-8 BOM !!!!!

    foreach ( $rows as $row ) {
        fputcsv( $df, $row );
    }
    fclose($df);
    exit();
person Reza Mamun    schedule 18.12.2015

Excel не поддерживает UTF-8. Вы должны закодировать свой текст UTF-8 в UCS-2LE.

mb_convert_encoding($output, 'UCS-2LE', 'UTF-8');
person Leopold Gault    schedule 08.11.2012
comment
Лучше использовать UTF-16LE, как было предложено выше, который охватывает все существующие символы. - person Ellert van Koperen; 05.12.2014
comment
Я заметил, что mb_convert_encoding работает нормально и правильно показывает диакритические знаки в моем экспортированном файле XLS. У меня есть конфигурации mysql по умолчанию и apache + php для работы с utf-8 - person Junior Mayhé; 13.10.2015

Чтобы продолжить это:

Похоже, проблема просто в Excel на Mac. Я не так создаю файлы, потому что даже создание CSV из Excel нарушает их. Я сохраняю как CSV и повторно импортирую, и все символы перепутались.

Итак ... похоже, на этот вопрос нет правильного ответа. Спасибо за все предложения.

Я бы сказал, что из всего, что я прочитал, предложение @Daniel Magliola о спецификации, вероятно, было бы лучшим ответом для другого компьютера. Но это все еще не решает мою проблему.

person Ben Saufley    schedule 11.01.2011
comment
Поскольку поддержка UTF8 несовместима между Mac и Windows, лучше всего использовать другую кодировку. Я обнаружил, что cp1252 в целом хорошо работает с материалами Microsoft. en.wikipedia.org/wiki/Windows-1252 - person s29; 04.02.2013
comment
Бен, на этот вопрос есть правильный ответ :) Смотрите мой! - person Tim Groeneveld; 09.02.2014

Это отлично работает в Excel как для Windows, так и для Mac OS.

Устранение проблем в Excel, при которых не отображаются символы, содержащие диакритические знаки, буквы кириллицы, греческие буквы и символы валюты.

function writeCSV($filename, $headings, $data) {   

    //Use tab as field separator
    $newTab  = "\t";
    $newLine  = "\n";

    $fputcsv  =  count($headings) ? '"'. implode('"'.$newTab.'"', $headings).'"'.$newLine : '';

    // Loop over the * to export
    if (! empty($data)) {
      foreach($data as $item) {
        $fputcsv .= '"'. implode('"'.$newTab.'"', $item).'"'.$newLine;
      }
    }

    //Convert CSV to UTF-16
    $encoded_csv = mb_convert_encoding($fputcsv, 'UTF-16LE', 'UTF-8');

    // Output CSV-specific headers
    header('Set-Cookie: fileDownload=true; path=/'); //This cookie is needed in order to trigger the success window.
    header("Pragma: public");
    header("Expires: 0");
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header("Cache-Control: private",false);
    header("Content-Type: application/octet-stream");
    header("Content-Disposition: attachment; filename=\"$filename.csv\";" );
    header("Content-Transfer-Encoding: binary");
    header('Content-Length: '. strlen($encoded_csv));
    echo chr(255) . chr(254) . $encoded_csv; //php array convert to csv/excel

    exit;
}
person Murali Krishna    schedule 09.02.2017
comment
это решение позволило мне сделать экспорт работающим и для Google Таблиц (некоторые другие потерпели неудачу) - person Cafn; 19.09.2018
comment
Это решение почти идеальное, я только что обнаружил одну проблему, когда одна ячейка содержит двойные кавычки, она пропускается .. - person Pierre; 04.12.2020

CSV-файл должен содержать метку порядка байтов.

Или, как предлагается, и обходной путь просто повторите его с телом HTTP

person Cybot    schedule 20.10.2011

Добавлять:

fprintf($file, chr(0xEF).chr(0xBB).chr(0xBF));

Or:

fprintf($file, "\xEF\xBB\xBF");

Перед записью любого контента в файл CSV.

Пример:

<?php
$file = fopen( "file.csv", "w");
fprintf( $file, "\xEF\xBB\xBF");
fputcsv( $file, ["english", 122, "বাংলা"]);
fclose($file);
person Rejaul    schedule 15.03.2016

Преобразование текста в кодировке utf-8 с использованием mb_convert_encoding не требуется. Просто добавьте три символа перед исходным содержимым:

$newContent = chr(239) . chr(187) . chr(191) . $originalContent

Для меня это решило проблему специальных символов в файлах csv.

person Rvanlaak    schedule 16.09.2014
comment
Невероятный; Я попробовал по крайней мере 10 других решений, и, похоже, единственное решение для меня - это одно, в сочетании с спецификацией UTF-8 через fputs. - person kaarto; 14.12.2018
comment
Что это за персонажи? Должно быть какое-то магическое заклинание. Единственное решение, которое сработало для меня после каждого другого ответа здесь. - person leymannx; 18.08.2020
comment
Эти объединенные символы называются байтовой меткой объекта, которая сообщает приложениям, которые проверяют ее, остальную часть содержимого следует рассматривать как UTF-8. - person Rvanlaak; 15.10.2020

Поскольку кодировка UTF8 плохо работает с Excel. Вы можете преобразовать данные в другой тип кодировки, используя iconv().

e.g.

iconv('UTF-8', 'ISO-8859-1//TRANSLIT', $value),
person Abrar A. Shareef    schedule 19.11.2012
comment
Это было единственное решение, которое сработало для меня с Excel Mac 2011. - person Christer Fernstrom; 19.09.2016

вы можете преобразовать строку CSV с помощью iconv. Например:

$csvString = "Möckmühl;in Möckmühl ist die Hölle los\n";
file_put_contents('path/newTest.csv',iconv("UTF-8", "ISO-8859-1//TRANSLIT",$csvString) );
person foued611    schedule 14.05.2012
comment
Отличные образцы текстов;) - person ngeek; 08.07.2016

Когда я исследовал и обнаружил, что UTF-8 плохо работает на MAC и Windows, я попробовал с Windows-1252, он хорошо поддерживается на обоих из них, но вы должны выбрать тип кодировки на ubuntu. Вот мой код$valueToWrite = mb_convert_encoding($value, 'Windows-1252');

$response->headers->set('Content-Type', $mime . '; charset=Windows-1252');
    $response->headers->set('Pragma', 'public');
    $response->headers->set('Content-Endcoding','Windows-1252');
    $response->headers->set('Cache-Control', 'maxage=1');
    $response->headers->set('Content-Disposition', $dispositionHeader);
    echo "\xEF\xBB\xBF"; // UTF-8 BOM
person Ho Ha    schedule 17.04.2017

Вы должны использовать кодировку «Windows-1252».

header('Content-Encoding: Windows-1252');
header('Content-type: text/csv; charset=Windows-1252');
header("Content-Disposition: attachment; filename={$filename}");

Возможно, вам нужно преобразовать свои строки:

private function convertToWindowsCharset($string) {
  $encoding = mb_detect_encoding($string);

  return iconv($encoding, "Windows-1252", $string);
}
person roNn23    schedule 10.04.2013

Вы можете добавить 3 байта в файл перед экспортом, у меня это работает. Раньше эта система работала только в Windows и HP -UX, но не работала в Linux.

FileOutputStream fStream = new FileOutputStream( f );
final byte[] bom = new byte[] { (byte) 0xEF, (byte) 0xBB, (byte) 0xBF };
OutputStreamWriter writer = new OutputStreamWriter( fStream, "UTF8" );
fStream.write( bom );

В начале файла укажите спецификацию UTF-8 (3 байта, шестнадцатеричный EF BB BF). В противном случае Excel будет интерпретировать данные в соответствии с кодировкой по умолчанию для вашего языкового стандарта (например, cp1252) вместо utf-8.

Создание CSV файл для Excel, как сделать новую строку внутри значения

person Cherry Yap    schedule 23.10.2013

Я на Mac, в моем случае мне просто нужно было указать разделитель с помощью "sep=;\n" и закодировать файл в UTF-16LE следующим образом:

$data = "sep=;\n" .mb_convert_encoding($data, 'UTF-16LE', 'UTF-8');
person Sebastien Horin    schedule 18.07.2016

Для меня ни одно из вышеперечисленных решений не сработало. Вот что я сделал для решения проблемы: измените значение с помощью этой функции в PHP-коде:

$value = utf8_encode($value);

Эти выходные значения правильно отображаются на листе Excel.

person Barani r    schedule 07.12.2016

У меня была такая же проблема, когда у меня была подпрограмма Excel VBA, которая импортировала данные. Поскольку CSV - это простой текстовый формат, я работал над этим, программно открывая данные в простом редакторе файлов, таком как Wordpad, и повторно сохранял их как текст в формате Unicode или копировал их оттуда в буфер обмена и вставлял в Excel. Если Excel не выполняет автоматический синтаксический анализ CSV в ячейки, это легко исправить с помощью встроенной функции «Текст в столбцы».

person Alain    schedule 03.12.2010
comment
Я пробовал это! Но он уже закодирован как текст Unicode… сохранение его как текста Unicode ничего не меняет. Как мне сохранить его как обычный текст, чтобы он не интерпретировал неправильно все специальные символы? - person Ben Saufley; 03.12.2010
comment
Я думаю, что, сохранив его как текст Unicode, Ален мог бы иметь в виду UTF-16LE. Windows часто (к сожалению) использует Unicode, чтобы неправильно ссылаться на UTF-16LE или UTF-16LE с ведущей спецификацией. Файл Блокнота - ›Диалог сохранения использует таким образом Unicode. - person Thanatos; 05.12.2010

Проблема все еще возникает, когда вы сохраняете его как файл .txt, и они открывают его в Excel с запятой в качестве разделителя?

Проблема может заключаться вовсе не в кодировке, а в том, что файл не является идеальным CSV по стандартам Excel.

person Alain    schedule 03.12.2010
comment
Насколько я знаю, форматирование CSV в порядке. Я могу без проблем создать идеальный CSV в TextEdit или даже переименовать txt в CSV, чтобы не пропустить ничего секретного - CSV - это просто текстовые файлы. К тому же форматирование в Excel идеальное, ломаются только специальные символы. Но на всякий случай я попробовал ваше предложение, и оно, к сожалению, вызывает те же проблемы. - person Ben Saufley; 03.12.2010
comment
От WTF они думали: имейте в виду, что согласно Microsoft правильный разделитель полей зависит от языкового стандарта. Файл, разделенный запятыми, может потребовать, чтобы поля были фактически разделены точкой с запятой в некоторых языковых стандартах - и вы ничего не можете сделать, кроме как предложить OpenOffice. - person djn; 05.12.2010
comment
это довольно безумно - к сожалению, у меня нет проблем с правильным разграничением полей. У меня проблемы с этими специальными символами. - person Ben Saufley; 07.12.2010

Я просто попробовал эти заголовки и установил Excel 2013 на ПК с Windows 7, чтобы правильно импортировать CSV-файл со специальными символами. Знак порядка байтов (BOM) был последним ключом, который заставил его работать.


    header('Content-Encoding: UTF-8');
    header('Content-type: text/csv; charset=UTF-8');
    header("Content-disposition: attachment; filename=filename.csv");
    header("Pragma: public");
    header("Expires: 0");
    echo "\xEF\xBB\xBF"; // UTF-8 BOM

person Brian    schedule 17.07.2013
comment
Да, это правильно, он будет правильно работать в Excel для Windows, но, как объясняется в моем ответе, он не будет работать в Excel для OS X. - person Tim Groeneveld; 18.08.2013

ЛЕГКОЕ решение для Mac Excel 2008: я много раз боролся с этим, но вот мое простое решение: откройте файл .csv в Textwrangler, который должен правильно открывать ваши символы UTF-8. Теперь в нижней строке состояния измените формат файла с «Unicode (UTF-8)» на «Western (ISO Latin 1)» и сохраните файл. Теперь перейдите в свой Mac Excel 2008 и выберите «Файл»> «Импорт»> «Выбрать csv»> «Найти файл»> в «Происхождение файла» выберите «Windows (ANSI)» и вуаля, символы UTF-8 отображаются правильно. По крайней мере, для меня ...

person Poul    schedule 11.08.2015

Я использую это, и это работает

header('Content-Description: File Transfer');
header('Content-Type: text/csv; charset=UTF-16LE');
header('Content-Disposition: attachment; filename=file.csv');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
// output headers so that the file is downloaded rather than displayed
// create a file pointer connected to the output stream
$output = fopen('php://output', 'w');
fputs( $output, "\xEF\xBB\xBF" );
// output the column headings
fputcsv($output, array('Thông tin khách hàng đăng ký'));
// fetch the data
$setutf8 = "SET NAMES utf8";
$q = $conn->query($setutf8);
$setutf8c = "SET character_set_results = 'utf8', character_set_client =
'utf8', character_set_connection = 'utf8', character_set_database = 'utf8',
character_set_server = 'utf8'";
$qc = $conn->query($setutf8c);
$setutf9 = "SET CHARACTER SET utf8";
$q1 = $conn->query($setutf9);
$setutf7 = "SET COLLATION_CONNECTION = 'utf8_general_ci'";
$q2 = $conn->query($setutf7);
$sql = "SELECT id, name, email FROM myguests";
$rows = $conn->query($sql);
$arr1= array();
if ($rows->num_rows > 0) {
// output data of each row
while($row = $rows->fetch_assoc()) {
    $rcontent = " Name: " . $row["name"]. " - Email: " . $row["email"];  
    $arr1[]["title"] =  $rcontent;
}
} else {
     echo "0 results";
}
$conn->close();
// loop over the rows, outputting them
foreach($arr1 as $result1):
   fputcsv($output, $result1);
endforeach;
person BoRnbeBaD    schedule 27.03.2016

person    schedule
comment
Как правило, ответы гораздо более полезны, если они включают объяснение того, для чего предназначен код, и почему это решает проблему, не вводя других. - person Tim Diekmann; 27.03.2018