ฉันจะส่งออก UTF-8 CSV ใน PHP ที่ Excel จะอ่านอย่างถูกต้องได้อย่างไร


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

นี่คือ Excel บน Mac - ดูเหมือนว่าจะมีข้อ จำกัด มากกว่า Excel บนพีซี ไม่มีดร็อปดาวน์เลยในกล่องโต้ตอบเปิดนอกเหนือจากประเภทไฟล์ที่จะเปิด ฉันดูทุกที่ ถ้าอยู่ตรงนั้นมันคลุมเครือ ฉันว่า 98% แน่นอน
Ben Saufley

Microsoft office หรือ openoffice
ajreal

Microsoft ดีกว่าในเรื่องนี้ไม่มีทาง (ที่ฉันค้นพบ) เพื่อให้ OpenOffice ตรวจจับชุดอักขระไม่ใช่แม้แต่ BOM สาปมัน
Ciantic

BOM ไม่มีผลกับ Microsoft Excel 2008 สำหรับ Mac เช่นกัน
Ben Saufley

คำตอบ:


134

ที่จะพูดวิศวกรฝ่ายสนับสนุนของไมโครซอฟท์ ,

Excel สำหรับ Mac ไม่รองรับ UTF-8 ในขณะนี้

อัปเดต, 2017 : นี่เป็นจริงของ Microsoft Excel สำหรับ Mac ทุกรุ่นก่อนOffice 20162016 รุ่นที่ใหม่กว่า (จาก Office 365) รองรับ UTF-8 แล้ว

ในการแสดงผลเนื้อหา UTF-8 ที่ Excel ทั้งบน Windows และ OS X จะสามารถอ่านได้สำเร็จคุณจะต้องทำสองสิ่ง:

  1. ตรวจสอบให้แน่ใจว่าคุณแปลงข้อความ UTF-8 CSV เป็น UTF-16LE

    mb_convert_encoding($csv, 'UTF-16LE', 'UTF-8');
  2. ตรวจสอบให้แน่ใจว่าคุณเพิ่มเครื่องหมายลำดับ UTF-16LEลงในจุดเริ่มต้นของไฟล์

    chr(255) . chr(254)

ปัญหาต่อไปที่ปรากฏเฉพาะกับ Excel ใน OS X ( ไม่ใช่ Windows) จะเกิดขึ้นเมื่อดูไฟล์ CSV ที่มีค่าคั่นด้วยเครื่องหมายจุลภาค Excel จะแสดงแถวด้วยแถวเดียวเท่านั้นและข้อความทั้งหมดพร้อมด้วยเครื่องหมายจุลภาคในแถวแรก

วิธีหลีกเลี่ยงสิ่งนี้คือการใช้แท็บเป็นค่าที่คั่นของคุณ

ฉันใช้ฟังก์ชั่นนี้จากความคิดเห็น PHP (ใช้แท็บ "\ t" แทนเครื่องหมายจุลภาค) และทำงานได้อย่างสมบูรณ์บน OS X และ Windows Excel

โปรดทราบว่าในการแก้ไขปัญหาคอลัมน์ว่างเปล่าในตอนท้ายของแถวฉันต้องเปลี่ยนบรรทัดของรหัสที่ระบุว่า:

    $field_cnt = count($fields);

ถึง

    $field_cnt = count($fields)-1;

ดังที่ความเห็นอื่น ๆ ในหน้านี้บอกว่าแอพสเปรดชีตอื่น ๆ เช่น OpenOffice Calc หมายเลขของ Apple และสเปรดชีตของ Google Doc ไม่มีปัญหากับไฟล์ UTF-8 พร้อมเครื่องหมายจุลภาค

ดูตารางในคำถามนี้ว่าอะไรใช้งานได้และไม่ทำงานกับไฟล์ Unicode CSV ใน Excel


เป็นหมายเหตุด้านข้างฉันอาจเพิ่มว่าถ้าคุณใช้นักแต่งเพลงคุณควรดูที่การเพิ่มLeague\Csvของคุณที่ต้องการ League\CsvมีAPI ที่ดีจริงๆสำหรับการสร้างไฟล์

หากต้องการใช้League\Csvกับวิธีการสร้างไฟล์ CSV นี้ลองดูตัวอย่างนี้


1
โทรหาฉันงี่เง่า แต่ฉันทำมันไม่ได้ ฉันแปลงข้อมูลของฉันโดยใช้ฟังก์ชั่น mb_convert_encoding และส่งออก BOM ก่อนเนื้อหาไฟล์ แต่ฉันเพิ่งได้รับอักขระจีนแถวเดียวเมื่อฉันเปิดไฟล์ใน Excel ฉันยังคงใช้จุลภาคมากกว่าตอนนี้ แต่น่าจะไม่ทำให้เกิดสิ่งที่ฉันเห็น
John Rix

@ JohnRix มันแปลก รหัสนี้มีการแก้ไขอย่างแท้จริงทุกปัญหาที่ฉันเคยมีเมื่อไฟล์ CSV ถูกส่งออก - ยกเว้นผู้นำเข้าที่จะยอมรับคอมม่าเท่านั้น คุณช่วยส่ง pastebin ของรหัสที่คุณใช้พร้อมกับอาร์เรย์ที่คุณแปลงเป็น CSV และสำเนาของไฟล์ที่ส่งออกมาได้หรือไม่
Tim Groeneveld

2
วิธีนี้แก้ไขปัญหา UTF8 สำหรับฉันบน Mac และ Windows ฉันยังพบว่าการเพิ่มบรรทัดด้วย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" ด้วยเหตุผลบางประการ C ใน. csv ย่อมาจาก "COMMA" dammit มันไม่ยากเลยที่จะทำ
ฟิล

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 จริง ๆ เมื่อคุณนำเข้า (คำเตือน: ความทรงจำที่
มืดมน

2
สิ่งนี้ถูกต้อง อย่างน้อยฉันได้ลองเพิ่ม BOM อย่างในตัวอย่างด้านบน แต่มันก็แสดงให้เห็นว่าตัวละครขี้ขลาดบางตัวในตอนเริ่มต้นและยังคงแสดงตัวอักษรพิเศษไว้อย่างผิดปกติ (ทดสอบใน Excel 2011) สิ่งนี้ดูเหมือนจะทำงานได้ดีที่สุดสำหรับฉันในการตั้งค่าทั้งหมด: stackoverflow.com/a/1648671/1005334 (โดยใช้ PHP)
kasimir

4
ฉันได้รับการแจ้งเตือนเกี่ยวกับคำถามนี้อย่างต่อเนื่องเพราะเห็นได้ชัดว่ามีคนอื่น ๆ จำนวนมากสะดุดเข้าหามัน ฉันหวังว่าฉันสามารถทำเครื่องหมายว่าถูกต้องเพราะมันได้รับการโหวตขึ้นมาก น่าเสียดายที่ในที่สุดฉันก็ให้วิธีการแก้ปัญหานี้ (ยกเลิกโครงการไปนานแล้ว) และมันไม่ได้ผลสำหรับฉันใน Excel 2008 สำหรับ Mac ดีใจที่มันทำงานให้คุณ ฉันอัปเกรดโซลูชันแล้ว แต่มันไม่ได้แก้ปัญหา Excel สำหรับ Mac 2008 ถ้าใครมีโชคใน Mac แน่นอนให้ฉัน (และเห็นได้ชัดว่าทุกคน ) รู้
Ben 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();

มีเพียงสิ่งเดียวที่แก้ไขปัญหาการเข้ารหัส UTF8 ในหน้าตัวอย่าง CSV เมื่อคุณกด Space bar บน Mac .. แต่ไม่ใช่ใน 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. ใช้PHPExcelระดับที่แนะนำโดย bpeterson76

    • การใช้คลาสนี้สร้างไฟล์ที่เข้ากันได้อย่างกว้างขวางที่สุดฉันสามารถสร้างไฟล์จากข้อมูลที่เข้ารหัส UTF-8 ซึ่งเปิดได้ดีใน Excel 2008 Mac, Excel 2007 Windows และ Google Docs
    • ปัญหาที่ใหญ่ที่สุดกับการใช้ PHPExcel ก็คือว่ามันช้าและใช้หน่วยความจำมากซึ่งไม่ได้เป็นปัญหาสำหรับไฟล์ขนาดพอสมควร แต่ถ้าแฟ้ม Excel / CSV ของคุณมีหลายร้อยหรือหลายพันแถวห้องสมุดนี้จะใช้ไม่ได้
    • นี่คือวิธี PHP ที่จะนำข้อมูล TSV และส่งออกไฟล์ Excel ไปยังเบราว์เซอร์โปรดทราบว่ามันใช้ 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 ฉันจึงต้องหาวิธีสร้างไฟล์ CSV หรือ TSV ที่รองรับ UTF-8 และ Excel

    • สิ่งที่ดีที่สุดที่ฉันสามารถทำได้คือไฟล์ที่เข้ากันได้กับ 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 ดังนั้นคั่นด้วยแท็บไม่ใช่คั่นด้วยเครื่องหมายจุลภาค ดูโพสต์ของ Marc ได้ที่นี่: stackoverflow.com/a/1648671/1697370
Ellert van 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 และ apache + php ตั้งค่าให้ทำงานกับ utf-8
Junior Mayhé

10

ในกรณีของฉันดังต่อไปนี้ทำงานได้ดีมากที่จะทำให้ไฟล์ CSV ที่มีตัวอักษร UTF-8 แสดงอย่างถูกต้องใน Excel

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

0xEF 0xBB 0xBFหัว BOM จะแจ้งให้ทราบ Excel การเข้ารหัสที่ถูกต้อง


1
ใหญ่ขึ้นสำหรับคุณ bro <3
Adrien G

fprintf($out, chr(0xEF).chr(0xBB).chr(0xBF));<- นี่คือสิ่งที่ฉันต้องการ มันทำงานเหมือนจับใจ
Alex

8

หากต้องการติดตามสิ่งนี้:

ปรากฏว่าปัญหาเกิดขึ้นกับ Excel บน Mac มันไม่ใช่วิธีที่ฉันสร้างไฟล์เพราะแม้แต่สร้าง CSV จาก Excelก็เป็นการทำลายไฟล์เหล่านั้น ฉันบันทึกเป็น CSV และนำเข้าอีกครั้งและตัวละครทั้งหมดจะเลอะ

ดังนั้น ... ดูเหมือนจะไม่มีคำตอบที่ถูกต้องสำหรับสิ่งนี้ ขอบคุณสำหรับคำแนะนำทั้งหมด.

ฉันจะบอกว่าจากทั้งหมดที่ฉันได้อ่านคำแนะนำของ @Daniel Magliola เกี่ยวกับ BOM อาจเป็นคำตอบที่ดีที่สุดสำหรับคอมพิวเตอร์เครื่องอื่น แต่ก็ยังไม่สามารถแก้ปัญหาของฉันได้


เนื่องจากการรองรับ UTF8 นั้นไม่สอดคล้องกันใน Mac vs Windows ทางออกที่ดีที่สุดคือการใช้การเข้ารหัสที่แตกต่างกันโดยสิ้นเชิง ฉันพบ cp1252 โดยทั่วไปเล่นได้ดีกับ Microsoft en.wikipedia.org/wiki/Windows-1252
s29

1
เบ็นมีคำตอบที่ถูกต้องสำหรับคำถามนี้ :) ดูของฉัน!
Tim Groeneveld

7

มันทำงานได้ดีใน excel สำหรับทั้ง 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 musst มีเครื่องหมายคำสั่งซื้อแบบไบต์

หรือตามที่แนะนำและวิธีแก้ปัญหาเพียงแค่สะท้อนกับร่างกาย 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

mb_convert_encodingไม่จำเป็นต้องแปลงข้อความที่เข้ารหัส utf-8 แล้วโดยใช้ เพียงเพิ่มตัวละครสามตัวต่อหน้าเนื้อหาต้นฉบับ:

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

สำหรับฉันแล้วการแก้ไขปัญหาของอักขระพิเศษในไฟล์ csv


เหลือเชื่อ; ฉันพยายามอย่างน้อย 10 การแก้ปัญหาอื่น ๆ และทางออกเดียวสำหรับผมน่าจะเป็นหนึ่งนี้เมื่อรวมกับ UTF-8 BOM fputsผ่าน
kaarto

2

ขณะที่ฉันตรวจสอบและพบว่า UTF-8 ทำงานได้ไม่ดีบน MAC และ Windows ดังนั้นฉันจึงลองกับ Windows-1252 มันรองรับทั้งสองอย่างได้ดี แต่คุณต้องเลือกประเภทการเข้ารหัสบน Ubuntu นี่คือรหัสของฉัน$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

คุณสามารถแปลง CSV String ของคุณด้วยiconv ตัวอย่างเช่น:

$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 ไบต์, Hex EF BB BF) ที่จุดเริ่มต้นของไฟล์ มิฉะนั้น Excel จะตีความข้อมูลตามการเข้ารหัสเริ่มต้นของสถานที่ของคุณ (เช่น cp1252) แทน utf-8

การสร้างไฟล์ CSV สำหรับ Excel, วิธีการขึ้นบรรทัดใหม่ภายในค่า



1

สำหรับฉันไม่มีวิธีแก้ปัญหาข้างต้นทำงาน ด้านล่างเป็นสิ่งที่ฉันทำเพื่อแก้ไขปัญหา: แก้ไขค่าโดยใช้ฟังก์ชั่นนี้ในรหัส PHP:

$value = utf8_encode($value);

ผลลัพธ์นี้ค่าอย่างถูกต้องในแผ่นงาน excel


0

ฉันมีปัญหาเดียวกันนี้เมื่อฉันมีรูทีน Excel VBA ที่นำเข้าข้อมูล เนื่องจาก CSV เป็นรูปแบบข้อความธรรมดาฉันจึงแก้ไขสิ่งนี้โดยการเปิดข้อมูลในโปรแกรมแก้ไขไฟล์อย่างง่ายเช่น wordpad และบันทึกเป็น unicode text หรือคัดลอกไปยังคลิปบอร์ดจากที่นั่นและวางลงใน Excel หาก excel ไม่แยกวิเคราะห์ CSV ลงในเซลล์โดยอัตโนมัติสิ่งนี้สามารถแก้ไขได้อย่างง่ายดายโดยใช้คุณลักษณะ "Text to Columns" ในตัว


ฉันลองแล้ว! แต่มันถูกเข้ารหัสเป็นข้อความ unicode แล้ว ... บันทึกเป็น unicode text จะไม่เปลี่ยนแปลงอะไรเลย ฉันจะบันทึกเป็นข้อความธรรมดาโดยไม่แปลอักขระพิเศษทั้งหมดไม่ถูกต้องได้อย่างไร
Ben Saufley

ฉันคิดว่า "บันทึกเป็น Unicode text" Alain อาจหมายถึง "UTF-16LE" Windows บ่อยครั้ง (เศร้า) ใช้ "Unicode" เพื่ออ้างถึง UTF-16LE หรือ UTF-16LE กับ BOM ชั้นนำอย่างไม่ถูกต้อง ไฟล์ของแผ่นจดบันทึก -> กล่องโต้ตอบบันทึกใช้ "Unicode" ในลักษณะนี้
Thanatos

0

ปัญหายังคงเกิดขึ้นเมื่อคุณบันทึกเป็นไฟล์. txt และเปิดขึ้นใน excel ด้วยเครื่องหมายจุลภาคเป็นตัวคั่นหรือไม่

ปัญหาอาจไม่ได้เข้ารหัสเลยอาจเป็นได้ว่าไฟล์นั้นไม่ได้เป็น CSV ที่สมบูรณ์แบบตามมาตรฐาน excel


เท่าที่ฉันรู้การจัดรูปแบบ CSV นั้นใช้ได้ ฉันสามารถสร้าง CSV "ที่สมบูรณ์แบบ" ใน TextEdit, ไม่มีปัญหาหรือเปลี่ยนชื่อ txt เป็น csv ดังนั้นมันจึงไม่มีความลับอะไรเลย CSVs เป็นเพียงไฟล์ข้อความ นอกจากนี้การจัดรูปแบบยังสมบูรณ์แบบใน Excel มันเป็นเพียงตัวอักษรพิเศษที่ทำให้แตก แต่ในกรณีที่ฉันลองข้อเสนอแนะของคุณและมันน่าเศร้าที่ทำให้เกิดปัญหาเดียวกัน
Ben Saufley

จากแผนก "คิดว่าเป็น WTF แล้วหรือไม่" โปรดทราบว่าตามที่ Microsoft ตัวคั่นฟิลด์ที่ถูกต้องนั้นขึ้นอยู่กับโลแคล ไฟล์ 'คั่นด้วยเครื่องหมายจุลภาค' อาจต้องการฟิลด์ที่คั่นด้วยเครื่องหมายอัฒภาคจริงในบางภาษา - และไม่มีอะไรที่คุณสามารถทำได้ยกเว้นการแนะนำ OpenOffice
djn

มันค่อนข้างบ้า - โชคไม่ดีที่ฉันไม่มีปัญหาในการแบ่งเขตข้อมูลอย่างถูกต้อง ฉันแค่มีปัญหากับตัวละครพิเศษเหล่านี้
Ben Saufley

0

โพสต์นี้ค่อนข้างเก่า แต่หลังจากเวลาผ่านไปหลายชั่วโมงฉันต้องการแบ่งปันวิธีแก้ปัญหาของฉัน ... บางทีมันอาจช่วยให้ใครบางคนจัดการกับ Excel และ Mac และ CSV และสะดุดกับภัยคุกคามนี้ ฉันกำลังสร้าง csv แบบไดนามิกเป็นผลลัพธ์จากฐานข้อมูลโดยคำนึงถึงผู้ใช้ Excel (UTF-8 พร้อม BOM)

ฉันลองใช้ไอคอน iconv มากมาย แต่ไม่สามารถใช้ umlauts ภาษาเยอรมันได้ใน Mac Excel 2004 วิธีแก้ปัญหาหนึ่ง: PHPExcel มันเยี่ยมมาก แต่สำหรับโครงการของฉันมากไปหน่อย สิ่งที่ทำงานสำหรับฉันคือการสร้างไฟล์ CSV และแปลงไฟล์ CSV นี้เพื่อ XLS กับ PHPsnippet นี้: csv2xls ผลลัพธ์ xls ทำงานร่วมกับ excel german umlauts (ä, ö, Ü, ... )


0

ฉันลองใช้ส่วนหัวเหล่านี้และรับ Excel 2013 บนพีซี Windows 7 เพื่อนำเข้าไฟล์ CSV ที่มีอักขระพิเศษอย่างถูกต้อง Mark By Order Order (BOM) เป็นกุญแจสุดท้ายที่ทำให้ใช้งานได้

    ส่วนหัว ('การเข้ารหัสเนื้อหา: UTF-8');
    ส่วนหัว ('ประเภทเนื้อหา: ข้อความ / csv; charset = UTF-8');
    header ("การจัดการเนื้อหา: ไฟล์แนบ; filename = filename.csv");
    ส่วนหัว ("Pragma: สาธารณะ");
    ส่วนหัว ("หมดอายุ: 0");
    echo "\ xEF \ xBB \ xBF"; // UTF-8 BOM


ใช่ว่าถูกต้องมันจะทำงานอย่างถูกต้องใน Excel สำหรับ Windows แต่ตามที่อธิบายไว้ในคำตอบของฉันมันจะไม่ทำงานบน Excel สำหรับ OS X
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: ฉันดิ้นรนกับซูนี้หลายครั้ง แต่นี่คือการแก้ไขที่ง่ายของฉัน: เปิดไฟล์. csv ใน Textwrangler ซึ่งควรเปิดตัว UTF-8 ของคุณอย่างถูกต้อง ตอนนี้ในแถบสถานะด้านล่างเปลี่ยนรูปแบบไฟล์จาก "Unicode (UTF-8)" เป็น "Western (ISO Latin 1)" และบันทึกไฟล์ ตอนนี้ไปที่ Mac Excel 2008 ของคุณแล้วเลือกไฟล์> นำเข้า> เลือก csv> ค้นหาไฟล์ของคุณ> ในแหล่งกำเนิดไฟล์เลือก "Windows (ANSI)" และ voila 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

#output UTF-8 CSV ใน PHP ที่ Excel จะอ่านได้อย่างถูกต้อง

//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 จะมีส่วนอยู่แล้วในคำตอบที่เลือก
Ben Saufley

@BenSaufley ดี แต่มันแก้ปัญหาของคำถามด้วย 2 บรรทัดง่าย ๆ ของรหัส
b3wii

คำถามได้รับการแก้ไขแล้วและอธิบายให้ละเอียดยิ่งขึ้นเช่นกัน
Ben Saufley
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.