Як я можу вивести CSV UTF-8 в PHP, щоб Excel правильно прочитав?


191

У мене дуже проста річ, яка просто виводить деякі речі у форматі 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" чи нічого, тому ... я трохи роздратований.

Я не можу ніде знайти чіткого рішення цього питання, незважаючи на те, що багато людей мають ту саму проблему. Найбільше я бачу - включити BOM, але я не можу точно зрозуміти, як це зробити. Як ви бачите вище, я просто отримую echoці дані, я не пишу жодного файлу. Я можу це зробити, якщо мені потрібно, я просто не тому, що в цьому моменті це не здається необхідним. Будь-яка допомога?

Оновлення: Я намагався повторювати BOM, echo pack("CCC", 0xef, 0xbb, 0xbf);який я щойно витягнув із сайту, який намагався виявити BOM. Але Excel просто додає цих трьох символів до першої комірки, коли вона імпортує, і все ще переплутує спеціальні символи.


2
Excel не надає можливість регулювати набір символів вхідного файлу? Ви на 100% впевнені в цьому? Я не маю під рукою копії, тому не можу спробувати, але я думаю, що десь має бути спадне поле.
Пекка

Це Excel на Mac - це здається більш обмеженим, ніж Excel на ПК. У діалоговому вікні "Відкрити" взагалі відсутні спадні місця, за якими типи файлів можна відкрити. Я всюди дивився. Якщо він є, це незрозуміло. Я б сказав 98% впевнений.
Бен Сафлі

Офіс Майкрософт або openoffice?
айреал

Microsoft кращий у цьому плані, немає жодного способу (що я знайшов), щоб змусити OpenOffice виявляти діаграму, навіть не BOM. Палки.
Сіантік

BOM також не впливає на Microsoft Excel 2008 для Mac.
Бен Сафлі

Відповіді:


134

Щоб запропонувати інженеру підтримки 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);

до

    $field_cnt = count($fields)-1;

Як зазначають деякі інші коментарі на цій сторінці, інші програми для електронних таблиць, такі як OpenOffice Calc, власні номери Apple і електронна таблиця Google Doc, не мають проблем з файлами UTF-8 із комами.

Про те, що працює, а що не працює для файлів Unicode CSV в Excel, перегляньте таблицю в цьому запитанні


В якості бічної примітки я можу додати, що якщо ви використовуєте композитор , вам слід поглянути на додавання League\Csvдо своїх потреб. League\Csvмає дійсно приємний API для створення CSV-файлів .

Щоб використовувати League\Csvцей метод створення файлів CSV, ознайомтеся з цим прикладом


1
Називай мене дурним, але я не можу зробити цю роботу. Я перетворив свої дані за допомогою функції mb_convert_encoding та вивів BOM, що передує вмісту файлу, але я просто отримую один ряд китайських символів, коли відкриваю файл у Excel. Я все ще використовую коми, а не вкладки, але, мабуть, це не повинно викликати те, що я бачу.
Джон Рікс

@JohnRix це дивно. Цей код буквально вирішив кожну проблему, яку я коли-небудь мав з експортованими файлами CSV - за винятком імпортерів, які приймають лише коми. Чи можете ви надішліть мені пастбін коду, який ви використовуєте, а також масив, який ви перетворюєте на CSV, та копію експортованого файлу?
Тім Гріневельд

2
Це рішення також вирішило проблему UTF8 для мене на Mac та Windows. Я також виявив, що додавання рядка з файлом CSV sep=;або sep=,у файл повідомляє Excel про те, як CSV відокремлено, і стовпці будуть створені знову правильно.
Люк Воллантс

5
Я виявив, що речі виходять зіпсованими, якщо я розпочав рядок як просто BOM, потім в іншому рядку додав значення "sep=,\n", потім в іншому рядку додав дані. Все було добре, якби я все це робив в один рядок ( $csv = chr(255) . chr(254) /* BOM */ . "sep=,\n" . mb_convert_encoding($csv, 'UTF-16LE', 'UTF-8');). Зараз на Mac все виглядає чудово. У мене немає Windows для тестування.
тремтіння

2
Єдина річ, яка для мене повністю працювала. Невідповідність Microsoft ніколи не перестає мене дивувати. Збереження звичайного файлу CSV використовує "," як роздільник, але якщо є BOM, то він зберігає за допомогою "\ t" чомусь. C в .csv означає "damma" COMMA. Це дійсно не важко зробити.
Філ

288

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

У моєму випадку, якщо я додаю BOM до виводу, він працює:

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

Я вважаю, що це досить некрасивий злом, але він працював на мене, принаймні для Windows Excel 2007. Не впевнений, що він працюватиме на Mac.


10
Некрасивий, але супер корисний. Дякую.
abelito

7
Я впевнений, що це зовсім не добре працює на OS X, на жаль. Я думаю, що він може відображати BOM під час імпорту (попередження: туманні спогади.)
davidtbernal

2
Це вірно. Принаймні, я спробував попередньо використовувати BOM, як у наведеному вище прикладі, але він справді просто показав кілька прикольних символів на початку і продовжував показувати спеціальні символи неправильно (перевірено в Excel 2011). Здається, це найкраще працювало для мене в усіх налаштуваннях: stackoverflow.com/a/1648671/1005334 (за допомогою PHP).
Казимир

4
Я продовжую отримувати сповіщення про це питання, оскільки, мабуть, багато інших людей натикаються на нього. Я б хотів, щоб я міг визначити це як правильне, тому що це було дуже схвалено. На жаль, я нарешті дав цю проблему (давно відмовився від цього проекту), і він не працює для мене в Excel 2008 для Mac. Радий, що працює для вас. Я підтримав рішення. Але це не вирішує проблему Excel для Mac 2008. Якщо хтось має удачу на Mac, обов'язково повідомте мене (і, мабуть, усіх ).
Бен Сафлі

Чудово працює, видаючи файл CSV в MS Excel Starter 2010. Дякую!
Джеймі Декстер

32

Ось як я це зробив (це підкаже браузер завантажити файл 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 ... не знаю, чому


1
Рядок BOM коду UTF-8 врятує мій день, експортуючи в xls
Младен Яньєтович

6
Я шукав спосіб вивести безпосередньо в браузер як utf8, коли я наткнувся на цю публікацію, ось моє рішення з кредитами до цієї публікації для BOM та бінарного заголовка передачі. $outstream = fopen( "php://output", 'w' ); fputs( $outstream, "\xEF\xBB\xBF" ); foreach ( $export as $fields ) { fputcsv( $outstream, $fields ); } fclose( $outstream );
fyrye

Друкарська помилка - видаліть подвійну )).
sitilge

22

Я просто вирішив ту саму проблему і придумав два рішення.

  1. Використовуйте клас PHPExcel, як запропонував bpeterson76 .

    • Використовуючи цей клас, створюється найбільш сумісний файл, мені вдалося створити файл із кодованих даних UTF-8, які добре відкрилися в Excel 2008 Mac, Windows Excel 2007 та 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.

    • Найкраще, що я міг придумати, - це файл, сумісний з Excel 2008 Mac та ПК Excel 2007, але не Google Документами, що досить добре для моєї програми.
    • Я знайшов рішення тут , в зокрема, ця відповідь , але ви також повинні прочитати прийнятий відповідь , як це пояснює проблему.
    • Ось 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;

Я зіткнувся з тією ж проблемою в Windows-7 Excel 2007 і спробував усі пропозиції, але не вдався :(
PHP Ferrari

Рішення UTF-16LE - це те, що працювало. Зауважте, що ви повинні форматувати tsv правильно, і він повинен бути tsc, тому вкладка розмежована, а не обмежена комами. Дивіться також публікацію Марка тут: stackoverflow.com/a/1648671/1697370
Ellert van Koperen

17

У мене виникло те саме питання, і це було вирішено як нижче:

    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();

13

Excel не підтримує UTF-8. Ви повинні кодувати текст UTF-8 в UCS-2LE.

mb_convert_encoding($output, 'UCS-2LE', 'UTF-8');

3
Краще використовувати UTF-16LE, як було запропоновано вище, що охоплює всіх наявних символів.
Еллерт ван Коперен

Я помітив, що це mb_convert_encoding працює нормально і правильно показує діакритику в експортованому XLS-файлі. У мене є конфігурації mysql за замовчуванням і apache + php для роботи з utf-8
Junior Mayhé

10

У моєму випадку наступне працює дуже приємно, щоб 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 знати правильний метод кодування.


1
великий для вас брато <3
Адріен G

fprintf($out, chr(0xEF).chr(0xBB).chr(0xBF));<- це саме те, що мені було потрібно. Це працює як шарм.
Алекс

8

Щоб продовжити це:

Здається, проблема просто в Excel на Mac. Я не буду генерувати файли, бо навіть генерування CSV-файлів з Excel порушує їх. Я зберігаю як CSV, так і реімпорт, і всі символи заплутані.

Отже… на це, здається, немає правильної відповіді. Дякую за всі пропозиції.

Я б сказав, що з усього, що я прочитав, пропозиція @Daniel Magliola про BOM, мабуть, буде найкращою відповіддю для якогось іншого комп'ютера. Але це все ще не вирішує мою проблему.


Оскільки підтримка UTF8 суперечлива для Mac та Windows, найкраще взагалі використовувати інше кодування. Я виявив, що cp1252 взагалі добре поєднується з матеріалами Microsoft. en.wikipedia.org/wiki/Windows-1252
s29

1
Бен, є правильна відповідь на це питання :) Дивіться моє!
Тім Гріневельд,

7

Це чудово працює на відмінність як для 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;
}

це рішення дозволило мені також здійснити експорт для Google Sheets (деякі інші не вдалися)
Cafn,

6

Файл CSV містить позначку порядку в байтах.

Або, як пропонується і вирішити, просто перегукуйтеся з тілом HTTP


5

Додати:

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

Або:

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

Перш ніж записати будь-який вміст у файл CSV.

Приклад:

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

4

Оскільки кодування UTF8 не грає добре з Excel. Ви можете перетворити дані в інший тип кодування за допомогою iconv().

напр

iconv('UTF-8', 'ISO-8859-1//TRANSLIT', $value),

Це єдине рішення, яке працювало для мене з Excel Mac 2011
Крістер Фернстром,

3

Перетворення вже закодованого тексту utf-8 за допомогою використання mb_convert_encodingне потрібно. Просто додайте три символи перед початковим вмістом:

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

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


Неймовірно; Я спробував принаймні 10 інших рішень, і єдиним рішенням для мене, здається, був цей, коли він поєднувався з UTF-8 BOM via fputs.
каарто

2

Коли я досліджував і виявив, що 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

2
**This is 100% works fine in excel for both Windows7,8,10 and also All Mac OS.**
//Fix issues in excel that are not displaying characters containing diacritics, cyrillic letters, Greek letter and currency symbols.

function generateCSVFile($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;
}

2
Як правило, відповіді набагато корисніші, якщо вони включають пояснення того, що призначений для виконання коду та чому це вирішує проблему, не вводячи інших.
Тім Дікманн

1

Як щодо просто виведення для самого Excel? Це відмінний клас, який дозволяє генерувати файли XLS на стороні сервера. Я часто використовую його для клієнтів, які не можуть "розібратися" у csv, і до цих пір жодного разу не скаржилися. Він також дозволяє отримати додаткове форматування (затінення, висоту рядків, обчислення тощо), яке CSV ніколи не зробить.


Майте на увазі, що у phpexcel є проблеми з великою кількістю даних.
Ellert van Koperen

1

ви можете конвертувати рядок 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) );

Чудові зразки текстів;)
ngeek

1

Ви повинні використовувати кодування "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);
}

1

Ви можете додати 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 );

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

Генерування файлу CSV для Excel, як мати новий рядок у значенні


1

Я на Mac, у моєму випадку мені просто довелося вказати роздільник "sep=;\n"і кодувати файл у UTF-16LE так:

$data = "sep=;\n" .mb_convert_encoding($data, 'UTF-16LE', 'UTF-8');

1

Для мене жодне з вищезгаданих рішень не спрацювало. Нижче - що я зробив, щоб вирішити проблему: змінити значення за допомогою цієї функції в коді PHP:

$value = utf8_encode($value);

Це значення виведення належним чином на аркуші Excel.


0

У мене була така ж проблема, коли у мене був Excel VBA-режим, який імпортував дані. Оскільки CSV - це звичайний текстовий формат, я працював над цим, систематично відкриваючи дані в простому редакторі файлів, як Wordpad, і повторно зберігав їх як текст унікоду, або копіюючи їх у буфер обміну і вставляючи його в Excel. Якщо excel не автоматично розбирає CSV в комірки, це легко усунути за допомогою вбудованої функції "Текст до стовпців".


Я спробував це! Але він уже закодований як текст Unicode ... збереження його як текст unicode нічого не змінює. Як би я врятував його як звичайний текст без неправильного тлумачення всіх спеціальних символів?
Бен Сафлі

Я думаю, що "збереження його як текст Unicode", Ален може означати "UTF-16LE". Windows часто (на жаль) використовує "Unicode" для неправильного посилання на UTF-16LE або UTF-16LE з провідним BOM. Файл блокнота -> Збереження використовує "Unicode" таким чином.
Танатос

0

Проблема все-таки виникає, коли ви зберігаєте її у форматі .txt, і вони відкриваються у відмінності із комою як роздільником?

Проблема може бути зовсім не в кодуванні, може бути лише те, що файл не є ідеальним CSV згідно стандартів excel.


Наскільки я знаю, форматування CSV добре. Я можу зробити "ідеальний" CSV в TextEdit, без проблем, або навіть перейменувати txt як CSV, так що нічого секретного не пропущено - CSV - це лише текстові файли. Плюс форматування в Excel все ідеально, це лише спеціальні символи, які ламаються. Але про всяк випадок я спробував вашу пропозицію, і це, на жаль, викликає ті самі проблеми.
Бен Сафлі

З відділу "WTF думали": майте на увазі, що відповідно до Microsoft, правильний роздільник поля залежить від локальної залежності. Файл "розділений комами" може знадобитися, щоб поля були фактично розділені крапкою з комою в деяких локалях - і нічого не можна зробити, окрім запропонувати OpenOffice
djn

це досить божевільно - на жаль, у мене немає проблем із належним розмежуванням полів. У мене просто проблеми з цими особливими персонажами.
Бен Сафлі

0

Ця публікація досить стара, але після годин спроб я хочу поділитися своїм рішенням ... можливо, це допомагає комусь, що має справу з Excel та Mac та CSV та натикається на цю загрозу. Я генерую CSV динамічно як вихід із бази даних, на увазі користувачів Excel. (UTF-8 з BOM)

Я спробував багато ікон, але не міг змусити німецьких умлатів працювати в Mac Excel 2004. Одне рішення: PHPExcel. Це чудово, але для мого проекту трохи забагато. Що для мене працює - це створити файл csv та перетворити цей файл csv у xls за допомогою цього PHPsnippet: csv2xls . результат xls працює з чудовими німецькими umlauts (ä, ö, Ü, ...).


0

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

    заголовок ('Content-Encoding: UTF-8');
    заголовок ('Тип вмісту: text / csv; charset = UTF-8');
    заголовок ("Content-disposition: attachment; filename = filename.csv");
    заголовок ("Прагма: публічний");
    заголовок ("Термін дії: 0");
    відлуння "\ xEF \ xBB \ xBF"; // UTF-8 BOM


Так, це правильно, він буде працювати правильно в Excel для Windows, але, як пояснено у моїй відповіді, він не працюватиме в Excel для OS X.
Тім Гроневельд,

0

Інакше ви можете:

header("Content-type: application/x-download");
header("Content-Transfer-Encoding: binary");
header("Content-disposition: attachment; filename=".$fileName."");
header("Cache-control: private");

echo utf8_decode($output);

0

EASY рішення для Mac Excel 2008: Я багато разів боровся з цим судом, але ось мій простий виправлення: відкрийте файл .csv у Textwrangler, який повинен правильно відкрити ваші UTF-8 символи. Тепер у нижній смузі стану змініть формат файлу з "Unicode (UTF-8)" на "Western (ISO Latin 1)" і збережіть файл. Тепер перейдіть до свого Mac Excel 2008 та виберіть «Файл»> «Імпорт»> «Виберіть csv»> Знайдіть файл> у «Походження файлу» виберіть «Windows (ANSI)» та виконайте запитання, щоб символи UTF-8 відображалися правильно. Принаймні, це для мене ...


0

Я використовую це, і це працює

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;

0

#output UTF-8 CSV в PHP, який Excel буде читати належним чином.

//Use tab as field separator   
$sep  = "\t";  
$eol  = "\n";    
$fputcsv  =  count($headings) ? '"'. implode('"'.$sep.'"', $headings).'"'.$eol : '';

Однієї відповіді на людину достатньо. Надалі пам’ятайте, що ви можете додати інформацію до своєї відповіді в будь-який час, вам не потрібно створювати 2
RiggsFolly

-1
//convert UTF-8 file without BOM to UTF-16LE for excel on mac
$fileUtf8String = file_get_contents("file.ext");
file_put_contents("file.ext", "\xFF\xFE" . mb_convert_encoding($fileUtf8String, "UTF-16LE", "UTF-8"));

Це питання не запитує, як конвертувати, а запитує, як вивести. Відповідна частина цього внеску, що виходить у UTF-16, вже внесена у Вибраний відповідь .
Бен Сафлі

@BenSaufley Ну, але це вирішує проблему з двома простими рядками коду
b3wii

Питання вже вирішено, і більш ретельно пояснено.
Бен Сафлі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.