원인: 출력 CSV 파일에 BOM이 없습니다.
BOM이란?
UCS 인코딩에는 "ZERO WIDTH NO-break SPACE"라는 문자가 있는데, 인코딩은 FEFF입니다. FFFE는 UCS에 존재하지 않는 문자이므로 실제 전송에서는 나타나지 않아야 한다. UCS 사양에서는 바이트 스트림을 전송하기 전에 "ZERO WIDTH NO-break SPACE" 문자를 전송할 것을 권장합니다. 이런 식으로 수신기가 FEFF를 수신하면 바이트 스트림이 Big-Endian임을 나타내고, FFFE를 수신하면 바이트 스트림이 Little-Endian임을 나타냅니다. 따라서 "ZERO WIDTH NO-break SPACE" 문자를 BOM이라고도 합니다.
UTF-8에서는 바이트 순서를 나타내기 위해 BOM이 필요하지 않지만 BOM을 사용하여 인코딩 방법을 나타낼 수 있습니다. "ZERO WIDTH NO-break SPACE" 문자의 UTF-8 인코딩은 EF BB BF입니다. 따라서 수신기가 EF BB BF로 시작하는 바이트 스트림을 수신하면 UTF-8로 인코딩되었음을 알 수 있습니다.
Windows에서는 BOM을 사용하여 텍스트 파일의 인코딩 방법을 표시합니다.
PHP에서 BOM을 어떻게 출력하나요?
모든 내용을 출력하기 전
print(chr(0xEF).chr(0xBB).chr(0xBF));
샘플 코드:
<?php function writeCsvToFile($file,array $data){ $fp = fopen($file, 'w'); //Windows下使用BOM来标记文本文件的编码方式 fwrite($fp,chr(0xEF).chr(0xBB).chr(0xBF)); foreach ($data as $line) { fputcsv($fp, $line); } fclose($fp); }