Excel에서 올바르게 읽을 수 있도록 PHP에서 UTF-8 CSV를 출력하려면 어떻게해야합니까?


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 % 확신합니까? 복사 할 수있는 편리한 도구가 없으므로 시도 할 수 없지만 어딘가에 드롭 다운 상자 가 있어야 한다고 생각 합니다 .
Pekka

이것은 Mac의 Excel이며 PC의 Excel보다 제한적입니다. 열기 대화 상자에는 열 수있는 파일 형식 외에 드롭 다운이 없습니다. 나는 모든 곳을 보았다. 있으면 모호합니다. 98 % 확실하다고합니다.
Ben Saufley

마이크로 소프트 오피스 또는 오픈 오피스?
ajreal

이와 관련하여 Microsoft가 더 낫습니다 .OpenOffice가 BOM뿐만 아니라 문자 집합을 감지하도록 할 수있는 방법이 없습니다. 젠장
Ciantic

BOM은 Mac 용 Microsoft Excel 2008에도 영향을 미치지 않습니다.
벤 Saufley

답변:


134

인용 마이크로 소프트 지원 엔지니어 ,

Mac 용 Excel은 현재 UTF-8을 지원하지 않습니다

2017 년 업데이트 : Office 2016 이전의 모든 Mac 용 Microsoft Excel 버전에 해당 됩니다. Office 365의 최신 버전은 이제 UTF-8을 지원합니다.

Windows 및 OS X 모두에서 Excel에서 읽을 수있는 UTF-8 컨텐츠를 출력하려면 두 가지 작업을 수행해야합니다.

  1. UTF-8 CSV 텍스트를 UTF-16LE로 변환하십시오.

    mb_convert_encoding($csv, 'UTF-16LE', 'UTF-8');
  2. 파일의 시작 부분에 UTF-16LE 바이트 순서 표시 를 추가 하십시오

    chr(255) . chr(254)

OS X에서 Excel에만 나타나는 다음 문제 되지 쉼표, Excel에서 하나의 행과 첫 번째 행에서 쉼표와 함께 모든 텍스트와 행을 렌더링 값을 분리하여 CSV 파일을 볼 때 윈도우)입니다.

이를 피하는 방법은 탭을 분리 된 값으로 사용하는 것입니다.

PHP 주석 (쉼표 대신 "\ t"탭 사용) 에서이 기능을 사용했으며 OS X 및 Windows Excel에서 완벽하게 작동했습니다.

행의 끝으로 빈 열의 문제를 해결하려면 다음과 같은 코드 줄을 변경해야했습니다.

    $field_cnt = count($fields);

    $field_cnt = count($fields)-1;

이 페이지의 다른 의견 중 일부에서 알 수 있듯이 OpenOffice Calc, Apple 자체의 Numbers 및 Google Doc 's Spreadsheet와 같은 다른 스프레드 시트 응용 프로그램에는 쉼표가있는 UTF-8 파일에 문제가 없습니다.

Excel에서 유니 코드 CSV 파일에 작동하고 작동하지 않는 것은 이 질문의 표를 참조하십시오 .


참고로 Composer 를 사용하는 경우 League\Csv요구 사항 에 추가하는 것을 살펴 봐야한다고 덧붙일 수 있습니다 . League\CsvCSV 파일을 구축하기위한 정말 좋은 API를 .

League\Csv이 CSV 파일 작성 방법과 함께 사용하려면 이 예제를 확인하십시오.


1
나를 바보라고 불러라. 그러나 나는 이것을 작동시킬 수 없다. mb_convert_encoding 함수를 사용하여 데이터를 변환하고 파일 내용 앞에 BOM을 출력했지만 Excel에서 파일을 열면 한 줄의 한자 문자 만 표시됩니다. 나는 여전히 탭 대신 쉼표를 사용하고 있지만 아마도 내가보고있는 것을 유발해서는 안됩니다.
John Rix

@JohnRix 이상합니다. 이 코드는 CSV 파일을 내보낼 때 쉼표 만 허용하는 수입 업체를 제외한 모든 문제를 문자 그대로 해결했습니다. CSV로 변환하는 배열 및 내 보낸 파일의 사본과 함께 사용중인 코드의 pastebin을 보내 주시겠습니까?
Tim Groeneveld

2
이 솔루션은 Mac 및 Windows에서 UTF8 문제를 해결했습니다. 또한 CSV 파일을 사용 sep=;하거나 sep=,CSV 파일에 줄을 추가하면 Excel에서 CSV가 분리되는 방식을 알려주고 열이 다시 올바르게 작성됩니다.
Luc Wollants

5
BOM으로 문자열을 시작한 다음 다른 줄에서을 추가 한 "sep=,\n"다음 다른 줄에서 데이터를 추가하면 문제가 발생합니다. 한 줄에 모두 수행하면 문제가 해결 된 것입니다 ( $csv = chr(255) . chr(254) /* BOM */ . "sep=,\n" . mb_convert_encoding($csv, 'UTF-16LE', 'UTF-8');). Mac에서는 모든 것이 멋지게 보입니다. 테스트 할 Windows가 없습니다.
tremby

2
완전히 나를 위해 일한 것. Microsoft의 불일치로 인해 놀라지 않을 것입니다. 일반 CSV 파일을 저장하면 ","가 구분 기호로 사용되지만 BOM이 있으면 어떤 이유로 "\ t"를 사용하여 저장합니다. .csv의 C는 "COMMA"dammit을 나타냅니다. 정말 어렵지 않습니다.
Phil

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

나는 이것이 못생긴 해킹이라고 생각하지만 적어도 Excel 2007 Windows에서는 나에게 효과적이었습니다. Mac에서 작동하는지 확실하지 않습니다.


10
추악하지만 매우 도움이됩니다. 감사합니다.
abelito

7
불행히도 OS X에서는 이것이 제대로 작동하지 않는다고 확신합니다. 가져올 때 실제로 BOM을 표시 할 수 있다고 생각합니다 (경고 : 흐릿한 추억).
davidtbernal

2
맞습니다. 적어도 위의 예와 같이 BOM을 추가하려고 시도했지만 실제로 처음에는 펑키 문자가 약간 표시되어 특수 문자를 잘못 표시했습니다 (Excel 2011에서 테스트 됨). 이것은 모든 설정에서 가장 효과적 인 것 같습니다 : stackoverflow.com/a/1648671/1005334 (PHP 사용).
kasimir

4
다른 많은 사람들이이 질문에 걸려 넘어지기 때문에이 질문에 계속 경고를받습니다. 나는 이것을 많이 찬성했기 때문에 이것을 올바른 것으로 표시 할 수 있기를 바랍니다. 불행히도, 나는 마침내이 솔루션에 대한 샷을 주었고 (오래 전에 그 프로젝트를 폐지했습니다) Mac 용 Excel 2008에서는 작동하지 않습니다. 그것이 당신을 위해 일하고 다행입니다. 솔루션을 상향 조정했습니다. 그러나 Mac 용 Excel 2008 문제는 해결되지 않습니다. Mac에서 운이 좋은 사람이라면 분명히 (그리고 분명히 모두에게 ) 알려주십시오.
벤 Saufley

CSV 파일을 MS Excel Starter 2010으로 아름답게 출력합니다. 대단히 감사합니다!
Jamie Dexter

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

Mac에서 스페이스 바를 쳤을 때 CSV 미리보기에서 UTF8 인코딩 문제를 해결 한 유일한 것은 .. Excel Mac 2008에서는 그렇지 않습니다 ... 이유를 모릅니다


1
코드의 UTF-8 BOM 라인은 xls로 내보내기로 하루를 절약합니다.
Mladen Janjetovic

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. bpeterson76 에서 제안한대로 PHPExcel 클래스 사용하십시오 .

    • 이 클래스를 사용하면 가장 광범위하게 호환되는 파일이 생성되므로 Excel 2008 Mac, Excel 2007 Windows 및 Google Docs에서 잘 열린 UTF-8 인코딩 데이터에서 파일을 생성 할 수있었습니다.
    • PHPExcel을 사용할 때 가장 큰 문제는 속도가 느리고 메모리를 많이 사용한다는 것입니다. 합리적인 크기의 파일에는 문제가되지 않지만 Excel / CSV 파일에 수백 또는 수천 개의 행이 있으면이 라이브러리를 사용할 수 없게 됩니다.
    • 다음은 일부 TSV 데이터를 가져 와서 브라우저로 Excel 파일을 출력하는 PHP 메소드입니다. 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의 효율성 문제로 인해 UTF-8 및 Excel 호환 CSV 또는 TSV 파일을 생성하는 방법도 알아 내야했습니다.

    • 내가 올릴 수있는 가장 좋은 것은 Excel 2008 Mac 및 Excel 2007 PC와 호환되는 파일이지만 Google Docs는 아닙니다. 응용 프로그램에 충분합니다.
    • 여기 에서 해결책 , 특히이 대답을 찾았 지만 문제를 설명하는대로 받아 들인 대답 을 읽어야합니다 .
    • 다음은 내가 사용한 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 반 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를 사용하는 것이 좋습니다.
Ellert van Koperen

이 mb_convert_encoding이 제대로 작동하고 내 보낸 XLS 파일에서 분음 부호가 올바르게 표시되는 것을 알았습니다. mysql 기본 구성이 있고 utf-8과 함께 작동하도록 Apache + PHP가 설정되어 있습니다
Junior Mayhé

10

필자의 경우 다음은 UTF-8 문자가 포함 된 CSV 파일을 Excel에서 올바르게 표시하는 데 매우 효과적입니다.

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

0xEF 0xBB 0xBFBOM 헤더는 Excel이 올바른 인코딩을 알려드립니다.


1
당신을 위해 큰 최대 <3
Adrien G

fprintf($out, chr(0xEF).chr(0xBB).chr(0xBF));<-이것이 바로 내가 필요한 것입니다. 그것은 매력처럼 작동합니다.
Alex

8

이에 대한 후속 조치 :

문제는 Mac의 Excel에서만 발생하는 것으로 보입니다. Excel에서 CSV 생성하기 때문에 파일을 생성하는 방식이 아닙니다. . CSV로 저장하고 다시 가져 오면 모든 문자가 엉망입니다.

따라서… 이에 대한 정답은없는 것 같습니다. 모든 제안에 감사드립니다.

필자가 읽은 모든 것에서 BOM에 대한 @Daniel Magliola의 제안은 아마도 다른 컴퓨터에 대한 최선의 대답 일 것입니다. 그러나 여전히 내 문제를 해결하지 못합니다.


UTF8 지원은 Mac과 Windows에서 일관되지 않으므로 다른 방법을 사용하는 것이 가장 좋습니다. cp1252는 일반적으로 Microsoft와 잘 어울립니다. en.wikipedia.org/wiki/Windows-1252
s29

1
벤,이 질문에 대한 정답이 있습니다 :) 내 것을보십시오!
Tim Groeneveld

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 스프레드 시트에서도 내보내기 작업을 수행 할 수있었습니다 (일부는 실패했습니다)
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에서 나를 위해 일한 유일한 솔루션이었습니다
Christer Fernstrom

3

이미 UTF-8로 인코딩 된 텍스트를 사용하여 변환 mb_convert_encoding할 필요는 없습니다. 원본 내용 앞에 세 문자 만 추가하십시오.

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

나를 위해 이것은 CSV 파일의 특수 문자 문제를 해결했습니다.


믿을 수 없는; 나는 적어도 10 개의 다른 솔루션을 시도했지만 나를위한 유일한 솔루션은 UTF-8 BOM과 결합하여 이것이 하나 인 것 같습니다 fputs.
kaarto

2

조사한 결과 UTF-8이 MAC 및 Windows에서 제대로 작동하지 않으므로 Windows-1252로 시도했지만 두 가지 모두에서 잘 지원되지만 우분투에서 인코딩 유형을 선택해야합니다. 여기 내 코드가 있습니다$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
일반적으로 코드의 목적과 다른 언어를 도입하지 않고 문제를 해결하는 이유에 대한 설명이 포함되어 있으면 답변이 훨씬 유용합니다.
Tim Diekmann

1

Excel 자체로 출력하는 것은 어떻습니까? 이것은 서버 측에서 XLS 파일을 생성 할 수 있는 훌륭한 클래스 입니다. csv를 "수집"할 수없고 지금까지 불만을 제기 한 적이없는 고객에게 자주 사용합니다. 또한 csv가 수행하지 않는 몇 가지 추가 서식 (음영, 행 높이, 계산 등)을 허용합니다.


phpexcel에는 lage 데이터 양에 문제가 있습니다.
Ellert van Koperen

1

iconv 로 CSV 문자열을 변환 할 수 있습니다 . 예를 들면 다음과 같습니다.

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

파일 시작 부분에 UTF-8 BOM (3 바이트, 16 진 EF BB BF)이 있어야합니다. 그렇지 않으면 Excel은 utf-8 대신 로케일의 기본 인코딩 (예 : cp1252)에 따라 데이터를 해석합니다.

Excel 용 CSV 파일 생성, 값 내에 줄 바꿈이있는 방법


1

저는 Mac에 있습니다. 제 경우에는 다음 "sep=;\n"과 같이 구분 기호를 지정하고 UTF-16LE로 파일을 인코딩해야했습니다.

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

1

나에게 위의 해결책 중 어느 것도 효과가 없었습니다. 다음은 문제를 해결하기 위해 수행 한 작업입니다. PHP 코드에서이 함수를 사용하여 값을 수정하십시오.

$value = utf8_encode($value);

이 출력값은 엑셀 시트에 올바로 표시됩니다.


0

데이터를 가져 오는 Excel VBA 루틴이있을 때도 동일한 문제가 발생했습니다. CSV는 일반 텍스트 형식이므로 워드 패드와 같은 간단한 파일 편집기에서 데이터를 프로그래밍 방식으로 열고 유니 코드 텍스트로 다시 저장하거나 클립 보드에 복사하여 Excel에 붙여 넣어이 문제를 해결했습니다. Excel이 자동으로 CSV를 셀로 구문 분석하지 않으면 기본 제공되는 "텍스트에서 열"기능을 사용하여 쉽게 해결할 수 있습니다.


나는 그것을 시도했다! 그러나 이미 유니 코드 텍스트로 인코딩되어 있습니다. 유니 코드 텍스트로 저장해도 아무런 변화가 없습니다. 모든 특수 문자를 잘못 해석하지 않고 일반 텍스트로 저장하려면 어떻게해야합니까?
Ben Saufley

"유니 코드 텍스트로 저장"하면 Alain이 "UTF-16LE"을 의미 할 수 있습니다. Windows는 종종 (슬프게) "유니 코드"를 사용하여 선행 BOM이있는 UTF-16LE 또는 UTF-16LE를 잘못 참조합니다. 메모장의 파일-> 저장 대화 상자는 이런 방식으로 "유니 코드"를 사용합니다.
타나토스

0

.txt 파일로 저장할 때 문제가 계속 발생하고 쉼표를 구분 기호로 사용하여 열 수 있습니까?

문제는 전혀 인코딩이 아닐 수 있으며 Excel 표준에 따라 파일이 완벽한 CSV가 아닐 수도 있습니다.


내가 아는 한 CSV 형식은 좋습니다. TextEdit에서 "완벽한"CSV를 만들거나 아무 문제없이 txt를 csv로 바꿀 수 있으므로 비밀이 없습니다. CSV는 텍스트 파일입니다. 또한 서식은 Excel에서 모두 완벽하며, 깨지는 특수 문자 일뿐입니다. 그러나 경우에 따라 귀하의 제안을 시도했지만 슬프게도 동일한 문제가 발생합니다.
Ben Saufley

"WTF가 생각하고 있었다"부서에서 : Microsoft에 따르면 올바른 필드 구분 기호는 로캘에 따라 다릅니다. '쉼표로 구분 된'파일은 일부 로케일에서 필드를 실제로 세미콜론으로 구분해야 할 수도 있습니다. OpenOffice 제안을 제외하고는 수행 할 수있는 작업이 없습니다.
djn

불행히도 나는 필드를 올바르게 구분하는 데 어려움이 없습니다. 나는이 특수 문자에 문제가 있습니다.
Ben Saufley

0

이 게시물은 꽤 오래되었지만 몇 시간 동안 노력한 후에 솔루션을 공유하고 싶습니다. 아마도 Excel 및 Mac 및 CSV를 다루는 사람을 도와이 위협에 걸려 넘어 질 수 있습니다. Excel 사용자를 염두에두고 데이터베이스에서 출력으로 csv를 동적으로 생성하고 있습니다. (BOT가있는 UTF-8)

나는 많은 iconv를 시도했지만 Mac Excel 2004에서 독일어 움라우트를 사용할 수 없었습니다. 하나의 솔루션 : PHPExcel. 훌륭하지만 내 프로젝트에는 너무 많습니다. 나를 위해 작동하는 것은 csv 파일을 만들고이 PHPsnippet을 사용 하여이 csv 파일을 xls로 변환하는 것입니다 : csv2xls . 결과 xls는 엑셀 독일어 움라우트 (ä, ö, Ü, ...)와 함께 작동합니다.


0

방금 이러한 헤더를 시도하고 Windows 7 PC에서 Excel 2013을 사용하여 특수 문자가있는 CSV 파일을 올바르게 가져 왔습니다. 바이트 순서 표시 (BOM)는 이것이 작동하게하는 마지막 열쇠였습니다.

    header ( '콘텐츠 인코딩 : UTF-8');
    헤더 ( '콘텐츠 유형 : text / csv; charset = UTF-8');
    header ( "콘텐츠 처리 : 첨부 파일; 파일 이름 = filename.csv");
    header ( "Pragma : public");
    header ( "만료 : 0");
    에코 "\ xEF \ xBB \ xBF"; // UTF-8 BOM


예, 맞습니다. Windows 용 Excel에서는 제대로 작동하지만 제 답변에서 설명한대로 OS X 용 Excel에서는 작동하지 않습니다.
Tim Groeneveld

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

Mac Excel 2008 용 EASY 솔루션 :이 문제로 여러 번 어려움을 겪었지만 여기에 쉬운 해결책이있었습니다. UTF-8 문자를 올바르게 열어야하는 Textwrangler에서 .csv 파일을여십시오. 이제 하단 상태 표시 줄에서 파일 형식을 "유니 코드 (UTF-8)"에서 "서부 (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

Excel에서 올바르게 읽을 수 있도록 PHP에서 UTF-8 CSV를 출력합니다.

//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으로 출력되는이 컨트 리뷰 션의 관련 부분은 이미 Selected Answer에 기여했습니다 .
벤 Saufley

@BenSaufley 글쎄, 그러나 그것은 간단한 두 줄의 코드로 문제의 문제를 해결합니다
b3wii

이 문제는 이미 해결되었으며 더 철저하게 설명되었습니다.
벤 Saufley
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.