복붙노트

Excel에서 올바르게 읽는 PHP에서 UTF-8 CSV를 출력하려면 어떻게합니까?

PHP

Excel에서 올바르게 읽는 PHP에서 UTF-8 CSV를 출력하려면 어떻게합니까?

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을 포함하는 것입니다.하지만이를 수행하는 방법을 정확히 파악할 수는 없습니다. 위에서 볼 수 있듯이 나는이 데이터를 반향하고 있으며 파일을 쓰지 않을 것입니다. 필요한 경우이를 수행 할 수 있습니다. 현재로서는 필요가없는 것처럼 보이기 때문에 아닙니다. 어떤 도움이 필요합니까?

업데이트 : BOM을 에코 팩 ( "CCC", 0xef, 0xbb, 0xbf)으로 반향시킵니다. BOM을 감지하려고 시도한 사이트에서 방금 가져 왔습니다. 그러나 Excel은 수입시 첫 번째 셀에이 세 문자를 추가하고 여전히 특수 문자를 엉망으로 만듭니다.

해결법

  1. ==============================

    1.Microsoft 기술 지원 엔지니어를 인용하려면,

    Microsoft 기술 지원 엔지니어를 인용하려면,

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

    Windows 및 OS X에서 Excel이 성공적으로 읽을 수있는 UTF-8 콘텐츠를 출력하려면 다음 두 가지 작업을 수행해야합니다.

    쉼표로 구분 된 값으로 된 CSV 파일을 볼 때 Excel은 한 행만있는 행과 모든 텍스트를 첫 행의 쉼표와 함께 렌더링합니다.

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

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

    비어있는 열의 문제를 행의 끝으로 수정하려면 다음 코드 행을 변경해야합니다.

        $field_cnt = count($fields);
    

        $field_cnt = count($fields)-1;
    

    이 페이지의 다른 의견에 따르면 OpenOffice Calc, Apple의 Numbers 및 Google Doc의 스프레드 시트와 같은 다른 스프레드 시트 응용 프로그램은 쉼표가있는 UTF-8 파일에는 문제가 없습니다.

    Excel에서 유니 코드 CSV 파일에 적용되는 것과 작동하지 않는 것에 대해이 질문의 표를 참조하십시오.

    참고로 Composer를 사용하는 경우 League \ Csv를 요구 사항에 추가해야합니다. 리그 \ Csv에는 CSV 파일을 작성하기위한 정말 멋진 API가 있습니다.

    CSV 파일을 만드는이 방법으로 League \ Csv를 사용하려면이 예제를 확인하십시오.

  2. ==============================

    2.나는 (또는 이와 유사한) 동일한 문제가있다.

    나는 (또는 이와 유사한) 동일한 문제가있다.

    내 경우 출력에 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에서 작동하는지 확신하지 못합니다.

  3. ==============================

    3.여기 내가 어떻게했는지 (브라우저에 CSV 파일을 다운로드하라는 메시지가 표시됩니다) :

    여기 내가 어떻게했는지 (브라우저에 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에서는 그렇지 않습니다 ... 이유를 모릅니다.

  4. ==============================

    4.난 그냥 같은 문제를 처리하고 두 가지 해결책을 생각해 냈습니다.

    난 그냥 같은 문제를 처리하고 두 가지 해결책을 생각해 냈습니다.

  5. ==============================

    5.Excel은 UTF-8을 지원하지 않습니다. UTF-8 텍스트를 UCS-2LE로 인코딩해야합니다.

    Excel은 UTF-8을 지원하지 않습니다. UTF-8 텍스트를 UCS-2LE로 인코딩해야합니다.

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

    6.나는 같은 문제가 있었는데 그것은 아래처럼 해결되었습니다 :

    나는 같은 문제가 있었는데 그것은 아래처럼 해결되었습니다 :

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

    7.후속 조치 :

    후속 조치 :

    문제는 단순히 Mac에서 Excel로 나타나는 것 같습니다. Excel에서 CSV를 생성하는 경우에도 파일을 생성하기 때문에 파일을 생성하는 방법이 아닙니다. CSV로 저장하고 다시 가져 오면 모든 문자가 엉망입니다.

    그래서 ... 정답이없는 것 같습니다. 모든 제안을 주셔서 감사합니다.

    내가 읽은 바에 따르면 Bodd에 대한 @Daniel Magliola의 제안은 아마도 다른 컴퓨터에 대한 최선의 대답 일 것입니다. 그러나 그것은 여전히 ​​내 문제를 해결하지 못합니다.

  8. ==============================

    8.CSV 파일에는 바이트 순서 표가 포함되어 있습니다.

    CSV 파일에는 바이트 순서 표가 포함되어 있습니다.

    아니면 제안 및 해결 방법으로 그냥 HTTP 본문으로 에코

  9. ==============================

    9.UTF8 인코딩은 Excel에서 잘 작동하지 않으므로 iconv ()를 사용하여 데이터를 다른 인코딩 유형으로 변환 할 수 있습니다.

    UTF8 인코딩은 Excel에서 잘 작동하지 않으므로 iconv ()를 사용하여 데이터를 다른 인코딩 유형으로 변환 할 수 있습니다.

    e.

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

    10.더하다:

    더하다:

    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);
    
  11. ==============================

    11.내가 조사한 결과, UTF-8이 MAC 및 Windows에서 잘 작동하지 않아 Windows-1252를 사용해 보았지만 둘 다 잘 지원하지만 우분투에서는 인코딩 유형을 선택해야합니다. 여기에 내 코드 $ valueToWrite = mb_convert_encoding ($ value, 'Windows-1252');

    내가 조사한 결과, 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
    
  12. ==============================

    12.내 경우에는 다음 작품은 UTF - 8 문자와 CSV 파일을 Excel에서 올바르게 표시 할 수있는 아주 좋은 작품.

    내 경우에는 다음 작품은 UTF - 8 문자와 CSV 파일을 Excel에서 올바르게 표시 할 수있는 아주 좋은 작품.

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

    0xEF 0xBB 0xBF BOM 헤더를 사용하면 Excel에서 올바른 인코딩을 알 수 있습니다.

  13. ==============================

    13.분음 기호, 키릴 문자, 그리스 문자 및 통화 기호가 포함 된 문자를 표시하지 않는 Excel의 문제 해결.

    분음 기호, 키릴 문자, 그리스 문자 및 통화 기호가 포함 된 문자를 표시하지 않는 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;
    }
    
  14. ==============================

    14.Excel 자체를 출력하는 것은 어떨까요? 이것은 XLS 파일을 서버 측에서 생성 할 수있는 훌륭한 클래스입니다. 나는 csv를 "알아낼"수없고 지금까지 불평이 없었던 고객을 위해 그것을 자주 사용합니다. 또한 csv가 수행하지 않는 몇 가지 추가 서식 (음영, 행렬, 계산 등)을 허용합니다.

    Excel 자체를 출력하는 것은 어떨까요? 이것은 XLS 파일을 서버 측에서 생성 할 수있는 훌륭한 클래스입니다. 나는 csv를 "알아낼"수없고 지금까지 불평이 없었던 고객을 위해 그것을 자주 사용합니다. 또한 csv가 수행하지 않는 몇 가지 추가 서식 (음영, 행렬, 계산 등)을 허용합니다.

  15. ==============================

    15.iconv로 CSV 문자열을 변환 할 수 있습니다.  예 :

    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) );
    
  16. ==============================

    16.인코딩 "Windows-1252"를 사용해야합니다.

    인코딩 "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);
    }
    
  17. ==============================

    17.나를 위해 위의 해결 방법 중 아무 것도 작동하지 않았습니다. 다음은이 문제를 해결하기 위해 수행 한 작업입니다. PHP 코드에서이 함수를 사용하여 값을 수정하십시오.

    나를 위해 위의 해결 방법 중 아무 것도 작동하지 않았습니다. 다음은이 문제를 해결하기 위해 수행 한 작업입니다. PHP 코드에서이 함수를 사용하여 값을 수정하십시오.

    $value = utf8_encode($value);
    

    이 출력은 엑셀 시트에서 적절하게 표시됩니다.

  18. ==============================

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

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

  19. ==============================

    19..txt 파일로 저장할 때 문제가 계속 발생하며 쉼표로 구분 기호로 Excel에서 열 때 문제가 발생합니까?

    .txt 파일로 저장할 때 문제가 계속 발생하며 쉼표로 구분 기호로 Excel에서 열 때 문제가 발생합니까?

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

  20. ==============================

    20.이 포스트는 꽤 오래되었지만 몇 시간이 지난 후에 나는 내 솔루션을 공유하려고합니다. 어쩌면 누군가 Excel과 Mac 및 CSV를 다루는 데 도움이되고이 위협을 넘어 설 수 있습니다. Excel 사용자가있는 데이터베이스에서 출력으로 동적으로 CSV를 생성합니다. (BOM이있는 UTF-8)

    이 포스트는 꽤 오래되었지만 몇 시간이 지난 후에 나는 내 솔루션을 공유하려고합니다. 어쩌면 누군가 Excel과 Mac 및 CSV를 다루는 데 도움이되고이 위협을 넘어 설 수 있습니다. Excel 사용자가있는 데이터베이스에서 출력으로 동적으로 CSV를 생성합니다. (BOM이있는 UTF-8)

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

  21. ==============================

    21.방금 이러한 헤더를 시도하고 Windows 7 PC에서 Excel 2013을 사용하여 특수 문자로 CSV 파일을 올바르게 가져 왔습니다. Byte Order Mark (BOM)가 작동하게 한 최종 키입니다.

    방금 이러한 헤더를 시도하고 Windows 7 PC에서 Excel 2013을 사용하여 특수 문자로 CSV 파일을 올바르게 가져 왔습니다. Byte Order Mark (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
    
    
  22. ==============================

    22.내보내기 전에 3 바이트를 파일에 추가 할 수 있습니다.이 파일은 저에게 적합합니다. 이 시스템을 사용하기 전에는 Windows 및 HP -UX에서만 작동하지만 Linux에서는 실패합니다.

    내보내기 전에 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 파일 생성, 값 내에서 개행을 사용하는 방법

  23. ==============================

    23.그렇지 않으면 다음을 할 수 있습니다.

    그렇지 않으면 다음을 할 수 있습니다.

    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);
    
  24. ==============================

    24.mb_convert_encoding을 사용하여 이미 utf-8로 인코딩 된 텍스트를 변환 할 필요가 없습니다. 원본 콘텐츠 앞에 세 개의 문자를 추가하십시오.

    mb_convert_encoding을 사용하여 이미 utf-8로 인코딩 된 텍스트를 변환 할 필요가 없습니다. 원본 콘텐츠 앞에 세 개의 문자를 추가하십시오.

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

    나에게 이것은 csv 파일의 특수 문자 문제를 해결했다.

  25. ==============================

    25.Mac Excel 2008을위한 간편한 솔루션 : 나는이 soo로 많은 시간 고투하고, 그러나 여기 나의 쉬운 고침이 있었다 : Textwrangler에서 .csv 파일을 열면 UTF-8 문자가 올바르게 열립니다. 이제 하단 상태 표시 줄에서 "유니 코드 (UTF-8)"에서 "Western (ISO Latin 1)"으로 파일 형식을 변경하고 파일을 저장하십시오. 이제 Mac Excel 2008로 이동하여 파일> 가져 오기> csv> 파일 찾기> 파일 원본에서 "Windows (ANSI)"를 선택하고 UTF-8 문자가 올바르게 표시되는지 확인하십시오. 적어도 그것은 나를 위해 ...

    Mac Excel 2008을위한 간편한 솔루션 : 나는이 soo로 많은 시간 고투하고, 그러나 여기 나의 쉬운 고침이 있었다 : Textwrangler에서 .csv 파일을 열면 UTF-8 문자가 올바르게 열립니다. 이제 하단 상태 표시 줄에서 "유니 코드 (UTF-8)"에서 "Western (ISO Latin 1)"으로 파일 형식을 변경하고 파일을 저장하십시오. 이제 Mac Excel 2008로 이동하여 파일> 가져 오기> csv> 파일 찾기> 파일 원본에서 "Windows (ANSI)"를 선택하고 UTF-8 문자가 올바르게 표시되는지 확인하십시오. 적어도 그것은 나를 위해 ...

  26. ==============================

    26.나는 이것을 사용하고 그것이 작동합니다.

    나는 이것을 사용하고 그것이 작동합니다.

    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;
    
  27. ==============================

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

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

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

    28.#output UTF-8 CSV는 PHP에서 Excel이 제대로 읽을 수 있습니다.

    #output UTF-8 CSV는 PHP에서 Excel이 제대로 읽을 수 있습니다.

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

    29.

    **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;
    }
    
  30. ==============================

    30.

    //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"));
    
  31. from https://stackoverflow.com/questions/4348802/how-can-i-output-a-utf-8-csv-in-php-that-excel-will-read-properly by cc-by-sa and MIT license