byte-order-mark 다운로드 header - Excel에서 올바르게 읽는 PHP에서 UTF-8 CSV를 출력하려면 어떻게합니까?





15 Answers

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

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

content type text

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을 echo pack("CCC", 0xef, 0xbb, 0xbf); 으로 echo pack("CCC", 0xef, 0xbb, 0xbf); BOM을 감지하려고 시도한 사이트에서 방금 가져 왔습니다. 그러나 Excel은 수입시 첫 번째 셀에이 세 문자를 추가하고 여전히 특수 문자를 엉망으로 만듭니다.




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

  1. PHPExcel 에서 제안한대로 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 문서 도구는 아니었기 때문에 내 응용 프로그램에 충분히 적합했습니다.
    • here 해결책, 특히이 대답을 찾았지만, 문제를 설명 할 때 수용된 대답 도 읽어야합니다.
    • 다음은 내가 사용한 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;
      



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

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



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

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




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

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



내 경우에는 다음 작품은 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에서 올바른 인코딩을 알 수 있습니다.




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




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



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

$value = utf8_encode($value);

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




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




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

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




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




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

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

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




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

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;



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



Related