Domanda

Ho questa cosa molto semplice che appena uscite alcune cose in formato CSV, ma è avuto modo di essere UTF-8. Apro il file in TextEdit o TextMate o Dreamweaver e visualizza i caratteri UTF-8 correttamente, ma se l'apro in Excel che sta facendo questo stupido IA genere di cose, invece. Ecco quello che ho alla testa del mio documento:

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

Tutto questo sembra avere l'effetto desiderato, tranne Excel (Mac, 2008) non vuole importare in modo corretto. Non c'è nessuna opzione in Excel per me "aperto come UTF-8", o niente, quindi ... mi sto un po 'seccato.

Non riesco a trovare alcuna soluzione chiara a questa parte, nonostante un sacco di persone che hanno lo stesso problema. La cosa che vedo di più è da includere la distinta, ma non riesco a capire esattamente come fare. Come potete vedere sopra Sto solo echoing questi dati, non sto scrivendo qualsiasi file. Posso farlo se ho bisogno di, io non sono solo, perché non sembra come un bisogno di esso a questo punto. Qualsiasi aiuto?

Aggiornamento: Ho provato riecheggiando la distinta come echo pack("CCC", 0xef, 0xbb, 0xbf); che ho appena tirato da un sito che stava cercando di rilevare la distinta base. Ma Excel appena aggiunge quei tre personaggi per la prima cella quando importa, e ancora scombina i caratteri speciali.

È stato utile?

Soluzione

Per citare un Microsoft Support engineer ,

  

Excel per Mac attualmente non supporta UTF-8

Aggiornamento 2017 : Questo è vero per tutte le versioni di Microsoft Excel per Mac prima di Ufficio 2016 . Le versioni più recenti (da Office 365) non ora supportano UTF-8.

Al fine di uscita UTF-8 di contenuti che Excel sia su Windows e OS X sarà in grado di leggere correttamente, è necessario fare due cose:

  1. Assicurarsi di convertire il testo UTF-8 a UTF-16

    mb_convert_encoding($csv, 'UTF-16LE', 'UTF-8');
    
  2. Assicurati di aggiungere il marchio UTF-16 byte order

    chr(255) . chr(254)
    

Il problema successivo che appare solo con Excel su OS X (ma non Windows) sarà durante la visualizzazione di un file CSV con valori separati da virgola, Excel renderà solo le righe con una riga e tutte le testo insieme alle virgole nella prima riga.

Il modo per evitare questo è quello di utilizzare le schede come valore separato.

questa funzione dai commenti PHP (utilizzando le schede " \ t" invece di virgole) e ha funzionato perfettamente su OS X e Windows Excel.

Si noti che per risolvere un problema con una colonna vuota come la fine di una riga, che ho dovuto modificare la riga di codice che dice:

    $field_cnt = count($fields);

a

    $field_cnt = count($fields)-1;

Mentre alcuni degli altri commenti su questa pagina per esempio, altre applicazioni di fogli di calcolo, come OpenOffice Calc, propri numeri di Apple e foglio di calcolo di Google Doc non hanno problemi con UTF-8 file con una virgola.

tavolo in questa domanda per ciò che funziona e non funziona per i file Unicode CSV in Excel


Come nota a margine, mi permetto di aggiungere che se si sta utilizzando Compositore , si dovrebbe avere uno sguardo a l'aggiunta di League\Csv al vostro richiede. League\Csv ha davvero un bel API per la creazione di file CSV .

Per usare League\Csv con questo metodo di creazione di file CSV, controlla questo esempio

Altri suggerimenti

Ho lo stesso (o simile) problema.

Nel mio caso, se posso aggiungere una distinta base all'uscita, funziona:

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

Credo che questo è un abbastanza brutto hack, ma ha funzionato per me, almeno per Excel 2007 di Windows. Non sono sicuro che funzionerà su Mac.

Ecco come ho fatto (che di per richiedere browser per scaricare il file 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();

L'unica cosa che risolto UTF8 codifica problema in CSV anteprima quando si colpisce la barra spaziatrice su Mac .. ma non in Excel Mac del 2008 ... non so perché

Ho appena affrontato lo stesso problema, e si avvicinò con due soluzioni.

  1. Utilizza la PHPExcel classe come suggerito da bpeterson76 .

    • Utilizzando questa classe genera il file più ampiamente compatibile, sono stato in grado di generare un file di dati da codifica UTF-8 che ha aperto bene in Excel 2008 per Mac, Excel 2007 di Windows, e Google Docs.
    • Il problema più grande con l'utilizzo di PHPExcel è che è lento e usa un sacco di memoria, che non è un problema per i file di dimensioni ragionevoli, ma se il file Excel / CSV ha centinaia o migliaia di righe, questa biblioteca diventa inutilizzabile .
    • Ecco un metodo di PHP che prenderà alcuni dati e di output TSV un file Excel al browser, nota che utilizza il Writer Excel5, il che significa che il file deve essere compatibile con le versioni precedenti di Excel, ma non ho hanno più accesso a qualsiasi, in modo da non posso provare.

      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. A causa dei problemi di efficienza con PHPExcel, ho anche dovuto capire come generare un file CSV compatibile con UTF-8 & Excel o un file TSV.

    • Il meglio che ho potuto venire con era un file che era compatibile con Excel 2008 per Mac, Excel 2007 e PC, ma non di Google Docs, che è abbastanza buono per la mia applicazione.
    • Ho trovato la soluzione qui , nello specifico, questa risposta , ma si dovrebbe anche leggere il accepted rispondere come si spiega il problema.
    • Ecco il codice PHP che ho usato, nota che sto usando TSV dati (schede come delimitatori invece di virgole):

      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;
      

ho avuto lo stesso problema e 'stato risolto come di seguito:

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

Excel non supporta UTF-8. È necessario codificare il testo UTF-8 in UCS-2LE.

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

Per un seguito a questo:

Sembra che il problema è semplicemente con Excel su Mac. Non è come sto generando i file, perché CSV anche la generazione di da Excel è romperle. Risparmio in formato CSV, e reimportazione, e tutti i personaggi sono incasinato.

Quindi ... non sembra essere una risposta corretta a questa. Grazie per tutti i suggerimenti.

direi che da tutto quello che ho letto, il suggerimento di @ Daniel Magliola sulla distinta sarebbe probabilmente la risposta migliore per qualche altro computer. Ma ancora non risolve il mio problema.

Nel mio caso in seguito a lavori molto bello fare file CSV con UTF-8 caratteri visualizzati correttamente in Excel.

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

L'intestazione della distinta base 0xEF 0xBB 0xBF lascerà Excel conosce la codifica corretta.

Questo funziona bene in Excel per Windows e anche Mac OS.

problemi correzione in Excel che non vengono visualizzati caratteri contenenti segni diacritici, caratteri cirillici, lettera greca e simboli di valuta.

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;
}

Il file CSV musst includere un Byte Order Mark.

O come suggerito e aggirare solo eco con il corpo HTTP

Dato che la codifica UTF-8 non gioca bene con Excel. È possibile convertire i dati a un altro tipo di codifica utilizzando iconv().

per es.

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

Aggiungi:

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

o

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

Prima di scrivere qualsiasi contenuto in un file CSV.

Esempio:

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

Non è necessaria la conversione già utf-8 testo codificato utilizzando mb_convert_encoding. Basta aggiungere tre personaggi di fronte al contenuto originale:

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

Per me questo ha risolto il problema dei caratteri speciali in file CSV.

Come ho studiato e ho scoperto che UTF-8 non funziona bene su MAC e Windows così ho provato con Windows-1252, supporta bene su entrambi, ma è necessario selezionare il tipo di codifica su Ubuntu. Ecco il mio code$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
**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;
}

Come circa appena l'output per Excel se stessa? Questo è un ottimo classe che permette di generare file XLS sul lato server. Io lo uso spesso per i clienti che non possono "figura fuori" csv di e finora non hanno mai avuto una denuncia. Permette anche di alcuni elementi di formattazione extra (ombreggiatura, rowheights, calcoli, ecc) che csv non potrà mai fare.

è possibile convertire la stringa di CSV con iconv .  per esempio:

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

Si deve usare la codifica "Windows-1252".

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

Forse è necessario convertire le stringhe:

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

  return iconv($encoding, "Windows-1252", $string);
}

È possibile aggiungere i 3 byte del file prima di esportare, funziona per me. Prima di fare quel sistema funzionano solo in Windows e HP-UX, ma non è riuscito in 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 );

Avere una BOM UTF-8 (3 byte, hex EF BB BF) all'inizio del file. In caso contrario, Excel interpreterà i dati secondo codifica di default del proprio locale (ad esempio CP1252) invece di UTF-8

file Generazione CSV per Excel, come avere una nuova riga all'interno di un valore

Sono su Mac, nel mio caso ho dovuto specificare il separatore con "sep=;\n" e codificare il file in UTF-16 in questo modo:

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

Per me nessuna delle soluzione di cui sopra ha funzionato. Qui di seguito è quello che ho fatto per risolvere il problema: modificare il valore di usare questa funzione nel codice PHP:

$value = utf8_encode($value);

Questa uscita Valori correttamente in un foglio excel.

Ho avuto questo stesso problema quando ho avuto una routine di Excel VBA che i dati importati. Dal momento che CSV è un formato di testo normale, ho lavorato intorno a questo aprendo programatically i dati in un editor di file semplice come WordPad, e ri-salvarlo come testo Unicode, o la copia negli appunti da lì e incollarlo in Excel. Se Excel non analizza automaticamente il CSV in cellule, questo è facilmente risolvibile utilizzando il costruito nel "Testo in colonne" caratteristica.

Il problema si verifica ancora quando si salva come file .txt e all'aperto che in excel con virgola come delimitatore?

Il problema non potrebbe essere la codifica a tutti, potrebbe essere solo che il file non è un CSV perfetto secondo gli standard di Excel.

Questo post è piuttosto vecchio, ma dopo ore di tentativi Voglio condividere la mia soluzione ... forse aiuta un operatore che con Excel e Mac e CSV e inciampa su questa minaccia. Sto generando un csv in modo dinamico in uscita da un database con gli utenti di Excel in mente. (UTF-8 con BOM)

Ho provato un sacco di iconv's ma riuscivo a ottenere dieresi tedesche che lavorano in Mac Excel 2004. Una soluzione: PHPExcel. E 'grande, ma per il mio progetto un po' troppo. Quello che funziona per me sta creando il file CSV e convertire il file CSV in XLS con questo PHPsnippet: csv2xls . il xls risultato lavora con Excel dieresi tedesco (ä, ö, ü, ...).

Ho appena provato queste intestazioni e ottenuto Excel 2013 su un PC Windows 7 a importare correttamente il file CSV con i caratteri speciali. Il Byte Order Mark (BOM) è stata la chiave finale che ha reso il lavoro.

    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

In caso contrario è possibile:

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

soluzione facile per Mac Excel 2008: Ho lottato con questo soo molte volte, ma qui era la mia soluzione semplice: Aprire il file .csv in TextWrangler che dovrebbe aprire correttamente i caratteri UTF-8. Ora, in fondo cambiamento barra di stato il formato del file da "Unicode (UTF-8)" a "occidentale (ISO Latin 1)" e salvare il file. Ora vai al tuo Mac Excel 2008 e selezionare File> Importa> Seleziona csv> Trova il tuo file> File di origine selezionare "Windows (ANSI)" e voilà l'UTF-8 caratteri stanno mostrando in modo corretto. Almeno lo fa per me ...

Io uso questa e funziona

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;

#output CSV UTF-8 in PHP che Excel leggerà correttamente.

//Use tab as field separator   
$sep  = "\t";  
$eol  = "\n";    
$fputcsv  =  count($headings) ? '"'. implode('"'.$sep.'"', $headings).'"'.$eol : '';
//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"));
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top