Microsoft Excel จัดการการออกเสียงในไฟล์. csv หรือไม่


190

ฉันกำลังส่งออกข้อมูลทางโปรแกรม (โดยใช้ PHP 5.2) ไปยังไฟล์ทดสอบ. csv
ข้อมูลตัวอย่าง: Numéro 1(สังเกต e ที่เน้นเสียง) ข้อมูลคือutf-8(ไม่มี BOM ที่จ่ายล่วงหน้า)

เมื่อเปิดไฟล์นี้ใน MS Excel Numéro 1เป็นแสดงเป็น

ฉันสามารถเปิดสิ่งนี้ในโปรแกรมแก้ไขข้อความ (UltraEdit) ซึ่งแสดงอย่างถูกต้อง UE decimal 233รายงานตัวอักษรเป็น

ฉันจะส่งออกข้อมูลตัวอักษรในไฟล์. csv ได้อย่างไรเพื่อให้MS Excel แสดงผลได้อย่างถูกต้องโดยไม่บังคับให้ใช้ตัวช่วยสร้างการนำเข้าหรือการตั้งค่าตัวช่วยที่ไม่ใช่ค่าเริ่มต้น


ฉันสนใจที่จะได้ยินเกี่ยวกับโซลูชัน BOM ของคุณมากขึ้นเพราะฉันเชื่อว่าฉันลอง "EF BB BF" ซึ่งไม่ได้ผลสำหรับฉัน
James Baker

3
วิธีแก้ปัญหาการทำงานที่เลือกคือ: * รวม BOM; utf-8 * ใช้ส่วนหัวนี้: 'Content-type: text / plain; charset = utf-8 'สิ่งนี้ "ทำงาน" ใน excel 2003 และ excel 2007 - โดยที่ทำงาน = เปิดโดยไม่มีตัวช่วยสร้างการนำเข้าและการแสดงออกเสียงถูกต้อง ฉันไม่ได้ตรวจสอบว่าจำเป็นต้องใช้ BOM หรือไม่
Freddo411

2
ต้องใช้ BOM ฉันเพิ่งทดสอบตอนนี้ หากไม่มีตัวอักษรพิเศษก็ไม่สามารถใช้งานได้
Alex Ciminian

2
จะรักถ้ามีใครสามารถพูดเพิ่มเติมเกี่ยวกับวิธีการเพิ่ม BOM (เครื่องหมายคำสั่งซื้อแบบไบต์) ถ้าฉันเพียงแค่ทำสิ่งที่ชอบ Response.Write (EF BB BF ") ตัวอักษรเหล่านั้นเพียงแค่แสดงขึ้นที่จุดเริ่มต้นของไฟล์.
sydneyos

sydneyos: ดังที่เฟอร์กัลกล่าวไว้ด้านล่าง; เตรียม \ uFEFF ให้กับสตริงของคุณ
noocyte

คำตอบ:


243

ไฟล์ UTF8 ที่จัดรูปแบบอย่างถูกต้องสามารถมีByte Order Markเป็นสามอ็อกเท็ตแรก นี่คือค่าเลขฐานสิบหก 0xEF, 0xBB, 0xBF octets เหล่านี้ทำหน้าที่ในการทำเครื่องหมายไฟล์เป็น UTF8 (เนื่องจากไม่เกี่ยวข้องกับข้อมูล "คำสั่งซื้อไบต์") 1 หาก BOM นี้ไม่มีอยู่ผู้บริโภค / ผู้อ่านจะถูกทิ้งให้อยู่ในประเภทการเข้ารหัสของข้อความ ผู้อ่านที่ไม่สามารถใช้ UTF8 ได้จะอ่านไบต์เป็นการเข้ารหัสอื่น ๆ เช่น Windows-1252 และแสดงอักขระที่จุดเริ่มต้นของไฟล์

มีข้อผิดพลาดที่รู้จักที่ Excel เมื่อเปิดไฟล์ UTF8 CSV ผ่านการเชื่อมโยงไฟล์ถือว่าพวกเขาอยู่ในการเข้ารหัสไบต์เดียวโดยไม่สนใจการปรากฏตัวของ UTF8 BOM สิ่งนี้ไม่สามารถแก้ไขได้ด้วยการตั้งค่าเริ่มต้นของเพจรหัสหรือการตั้งค่าภาษา BOM จะไม่แยแสใน Excel - เพียง แต่ใช้งานไม่ได้ (รายงานผู้ถือหุ้นส่วนน้อยอ้างว่าบางครั้ง BOM เรียกใช้ตัวช่วยสร้าง "นำเข้าข้อความ") ข้อผิดพลาดนี้มีอยู่ใน Excel 2003 และก่อนหน้า รายงานส่วนใหญ่ (ท่ามกลางคำตอบที่นี่) บอกว่าสิ่งนี้ได้รับการแก้ไขใน Excel 2007 และใหม่กว่า

โปรดทราบว่าคุณสามารถเปิดไฟล์ UTF8 CSV ใน Excel ได้อย่างถูกต้องโดยใช้ตัวช่วยสร้าง "นำเข้าข้อความ" ซึ่งช่วยให้คุณระบุการเข้ารหัสของไฟล์ที่คุณกำลังเปิดอยู่ แน่นอนว่ามันสะดวกน้อยกว่ามาก

ผู้อ่านของคำตอบนี้มีแนวโน้มมากที่สุดในสถานการณ์ที่พวกเขาไม่ได้สนับสนุน Excel <2007 โดยเฉพาะ แต่กำลังส่งข้อความ UTF8 แบบดิบไปยัง Excel ซึ่งเป็นการตีความที่ผิดและการโรยข้อความของคุณด้วยÃและอักขระ Windows-1252 อื่น การเพิ่ม UTF8 BOM น่าจะเป็นการแก้ไขที่ดีที่สุดและเร็วที่สุดของคุณ

หากคุณติดอยู่กับผู้ใช้ที่เก่งกว่าเดิมและ Excel เป็นผู้บริโภค CSV เดียวของคุณคุณสามารถแก้ไขได้ด้วยการส่งออก UTF16 แทน UTF8 Excel 2000 และ 2003 จะดับเบิลคลิกเปิดได้อย่างถูกต้อง (โปรแกรมแก้ไขข้อความอื่น ๆ อาจมีปัญหากับ UTF16 ดังนั้นคุณอาจต้องชั่งน้ำหนักตัวเลือกของคุณอย่างระมัดระวัง)


* ยกเว้นเมื่อคุณทำไม่ได้ (อย่างน้อย) Excel 2011 สำหรับตัวช่วยสร้างการนำเข้าของ Mac ไม่ได้ทำงานกับการเข้ารหัสทั้งหมดเสมอไปโดยไม่คำนึงถึงสิ่งที่คุณบอก </anecdotal-evidence> :)


14
เอาฉันไปตลอดกาลเพื่อหาที่ที่จะระบุการเข้ารหัส บันทึกไดอะล็อก> ปุ่มเครื่องมือ> ตัวเลือกเว็บ> แท็บการเข้ารหัส พวกเขาแน่ใจว่าซ่อนสิ่งสำคัญเช่นนั้นได้ดี
Triynko

6
ผิด: การเพิ่ม BOM ลงในไฟล์ UTF-8 จะโหลดไฟล์นั้นอย่างถูกต้องโดยไม่ต้องใช้ตัวช่วยสร้างการนำเข้าใน Excel 2007
Victor Nicollet

3
เราพบสิ่งเดียวกันกับที่วิกเตอร์กล่าววันนี้ (ใช้ Excel 2010 ทุกอย่างที่เรามี) การเพิ่ม UTF-8 BOM / Signature (EF BB BF) ดูเหมือนจะแก้ไขการดับเบิลคลิกโดยใช้การเข้ารหัสค่าเริ่มต้นของระบบและใช้ UTF8 อย่างถูกต้อง :)
Danny Tuppeny

20
โดยทั่วไปไฟล์ที่เข้ารหัส UTF-8 ไม่ควรมีการทำเครื่องหมาย Byte Order UTF-8 ไม่มีการเรียงลำดับไบต์และวางไว้ที่การก่อวินาศกรรมความเข้ากันได้ของ ASCII ของ UTF-8 มีรูปแบบไฟล์เฉพาะบางรูปแบบที่อนุญาตหรือสนับสนุน UTF-8 faux-BOM แต่อย่างอื่นควรหลีกเลี่ยง CSV นั้นไม่มีการเข้ารหัสทั้งหมดดังนั้นจึงไม่มีใครคาดเดาว่าเครื่องมือที่กำหนดจะตีความลำดับไบต์ 0xEF 0xBB 0xBF เป็นตัวบ่งชี้ UTF-8 หรือไม่ อักขระควบคุมที่มองไม่เห็นในเซลล์แรก อักขระในเซลล์แรก หรืออย่างอื่นอย่างสิ้นเชิง
bobince

3
@Ian: ไม่มีใครรู้ว่ามันเป็น UTF-8 พร้อม BOM อย่างใดอย่างหนึ่ง - 0xEF 0xBB 0xBF เป็นลำดับที่ถูกต้องในการเข้ารหัสแบบดั้งเดิมส่วนใหญ่เช่นกัน มันช่วยในการเดาอัลกอริธึมเท่านั้นและสำหรับรูปแบบไฟล์ที่ให้ความช่วยเหลือเป็นพิเศษ (เช่น XML) ข้อเสียของการรวมไฟล์ faux-BOM ในไฟล์ UTF-8 คือคุณทำลายความเข้ากันได้ของ ASCII (จุดขายที่สำคัญสำหรับ UTF-8) เครื่องมือข้อความเข้ารหัสที่ไม่รู้ตัวจำนวนมากจะต้องเผชิญกับ faux-BOM ชั้นนำที่ไม่คาดคิด
bobince

39

การเตรียม BOM (\ uFEFF) ใช้งานได้สำหรับฉัน (Excel 2007) ใน Excel นั้นได้รับการยอมรับว่าเป็นไฟล์ UTF-8 ไม่เช่นนั้นการบันทึกและการใช้ตัวช่วยสร้างการนำเข้าจะได้ผล แต่ก็ไม่เหมาะอย่างยิ่ง


1
มันยังคงเปิดตัวช่วยสร้างการนำเข้าข้อความดังนั้นความแตกต่างคือคุณสามารถคลิกสองครั้งได้ดังนั้นจึงยังไม่เหมาะ แต่เป็นโซลูชันที่รู้จักเท่านั้น
haridsv

สำหรับฉันไม่มีตัวช่วยสร้างการนำเข้าปรากฏขึ้นพร้อม Excel 2007
Victor Nicollet

ไม่มีตัวช่วยสร้างการนำเข้าสำหรับฉัน - ใช้งานได้ตามที่คาดหวังถ้ามี UTF8 BOM / Signature (EF BB BF)
Danny Tuppeny

นอกจากนี้ยัง\ufeffเป็นUTF-16 (BE) BOM ไม่ใช่ UTF-8 BOM
Alastair McCormack

2
ไม่ @AlastairMcCormack มันขึ้นอยู่กับว่ามันถูกเข้ารหัสอย่างไร "\ ufeff" เข้ารหัสเป็น UTF-8 เป็น EF BB BF (เข้ารหัสเป็น UTF-16 ซึ่งจะมีเพียงสองไบต์)
Dave Burt

30

ด้านล่างเป็นรหัส PHP ที่ฉันใช้ในโครงการเมื่อส่ง Microsoft Excel ไปยังผู้ใช้:

  /**
   * Export an array as downladable Excel CSV
   * @param array   $header
   * @param array   $data
   * @param string  $filename
   */
  function toCSV($header, $data, $filename) {
    $sep  = "\t";
    $eol  = "\n";
    $csv  =  count($header) ? '"'. implode('"'.$sep.'"', $header).'"'.$eol : '';
    foreach($data as $line) {
      $csv .= '"'. implode('"'.$sep.'"', $line).'"'.$eol;
    }
    $encoded_csv = mb_convert_encoding($csv, 'UTF-16LE', 'UTF-8');
    header('Content-Description: File Transfer');
    header('Content-Type: application/vnd.ms-excel');
    header('Content-Disposition: attachment; filename="'.$filename.'.csv"');
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
    header('Pragma: public');
    header('Content-Length: '. strlen($encoded_csv));
    echo chr(255) . chr(254) . $encoded_csv;
    exit;
  }

อัปเดต: การปรับปรุงชื่อไฟล์และการคำนวณ BUG แก้ไขความยาวที่ถูกต้อง ขอบคุณTRiGและ@ ivanhoe011


1
ฉันลองใช้คำแนะนำอื่น ๆ ในหน้านี้ แต่สิ่งนี้ใช้ได้ผลกับฉันใน Excel 2007 การเปลี่ยนแปลงที่สำคัญที่สุดคือการใช้แท็บแทนเครื่องหมายจุลภาค (แม้ว่าจะเป็นไฟล์. csv) และบรรทัดด้านบนนั้น echos ตัวละครสองตัวตามด้วย โทรไปที่ mb_convert_encoding () ฉันยังต้องคอมไพล์ PHP อีกครั้งด้วย --enable-mbstring เพื่อรับการสนับสนุนสำหรับ mb_convert_encoding () ขอบคุณ!
รัสเซล G

1
มันก็ใช้ได้ดีสำหรับฉันเช่นกันขอบคุณ อย่างไรก็ตามใน Safari ฉันได้รับข้อผิดพลาดในคอนโซลของฉัน 'ทรัพยากรตีความเป็นเอกสาร แต่ถ่ายโอนเป็น ... ' ฉันเดาว่ามันเป็นมุมแหลมของ WebKit ตัดสินstackoverflow.com/questions/3899426/ …แต่อาจไม่ใช่และ / หรือบางคนมี พบทางออก นอกจากนี้ในตัวอย่างของคุณฉันขอแนะนำการเปลี่ยนแปลง: 'Content-Disposition: attachment; filename="'.$filename.'.csv"'เนื่องจาก Firefox ต้องการอัญประกาศมิฉะนั้นมันจะตัดชื่อไฟล์ของคุณหลังจากช่องว่าง
kasimir

เหตุใดคุณจึงส่งออก CSV ( text/csv) แต่เรียกว่า Excel ( application/vnd.ms-excel)
TRiG

2
มันใช้งานได้ดี! ฉันสามารถยืนยันได้ว่าทำงานได้กับ Mac เช่นกัน (ใน Office 2011)
Jonathan

สิ่งนี้ไม่ควรเป็นheader('Content-Length: '. mb_strlen($encoded_csv, 'UTF-16LE'));หรือ
Rich Bradshaw

13

คำตอบสำหรับการรวมกันของรุ่น Excel (2003 + 2007) และประเภทไฟล์ทั้งหมด

คำตอบอื่น ๆ ส่วนใหญ่ที่นี่เกี่ยวข้องกับรุ่น Excel เท่านั้นและไม่จำเป็นต้องช่วยคุณเพราะคำตอบอาจไม่เป็นจริงสำหรับ Excel รุ่นที่คุณใช้

ตัวอย่างเช่นการเพิ่มอักขระ BOM จะทำให้เกิดปัญหากับการรู้จำตัวคั่นคอลัมน์อัตโนมัติ แต่ไม่ใช่สำหรับทุกรุ่นของ Excel

มีตัวแปร 3 ตัวที่พิจารณาว่าใช้ได้กับ Excel เวอร์ชันส่วนใหญ่หรือไม่

  • การเข้ารหัส
  • การปรากฏตัวของ BOM
  • ตัวแยกเซลล์

มีคนอดทนที่ SAP ลองใช้ชุดค่าผสมทั้งหมดแล้วรายงานผลลัพธ์ ผลลัพธ์สุดท้ายคืออะไร ใช้ UTF16le กับ BOM และอักขระแท็บเป็นตัวคั่นเพื่อให้มันทำงานใน Excel รุ่นส่วนใหญ่

คุณไม่เชื่อฉัน ฉันก็จะไม่อ่าน แต่ที่นี่และร้องไห้: http://wiki.sdn.sap.com/wiki/display/ABAP/CSV+tests+of+encoding+and+column+separator


ทำไมไม่เพิ่มsep=,หรือสิ่งที่คุณต้องการใช้? หากคุณเพิ่ม BOM แล้วฉันคิดว่าคุณไม่ชอบที่จะเพิ่มเนื้อหาลงในไฟล์
Casey

ที่จริงแล้วเพื่อตอบคำถามของฉันคุณจะไม่เพิ่มการประกาศตัวคั่นฟิลด์เพราะจะทำให้เคล็ดลับนี้หยุดทำงาน ดังนั้นโดยทั่วไปมันเป็นการเข้ารหัสที่อ่านไม่ออกหรือไฟล์ของคุณไม่ได้รับการตีความอย่างเหมาะสมว่าเป็น CSV หากผู้ใช้ของคุณมีการตั้งค่าภูมิภาคที่ไม่ถูกต้อง
Casey

1
utf-16le + BOM (0xFF 0xFE) + แท็บดีที่สุด
zhaozhi

10

เลือก UTF-8 เข้ารหัสเมื่อนำเข้า ถ้าคุณใช้ Office 2007 นี่คือที่ที่คุณเลือก: ทันทีหลังจากที่คุณเปิดไฟล์


1
สิ่งนี้มีประโยชน์ ฉันได้แก้ไขคำถามที่จะถามว่าการทำเช่นนี้โดยไม่ต้อง resorting วิซาร์ด
Freddo411

9

Echo UTF-8 BOM ก่อนที่จะส่งออกข้อมูล CSV วิธีนี้ช่วยแก้ไขปัญหาเกี่ยวกับอักขระทั้งหมดใน Windows แต่ไม่สามารถใช้งานได้กับ Mac

echo "\xEF\xBB\xBF";

มันใช้งานได้สำหรับฉันเพราะฉันต้องการสร้างไฟล์ที่จะใช้กับพีซี Windows เท่านั้น


ไม่เป็นความจริงสำหรับตัวคั่นคอลัมน์ทุกประเภทหรือทุกรุ่นของ Excel อ่านคำตอบของฉันด้านล่าง (ด้านล่างตอนนี้)
Christiaan Westerbeek

7

UTF-8 ไม่ทำงานสำหรับฉันใน office 2007 ที่ไม่มี Service Pack ใด ๆ ที่มีหรือไม่มี BOM (U + ffef หรือ 0xEF, 0xBB, 0xBF, ไม่ทำงาน) ติดตั้ง sp3 ทำให้ UTF-8 ทำงานเมื่อ 0xEF, 0xBB, 0xBF BOM เป็น เพิ่มด้านหน้า

UTF-16 ทำงานเมื่อเข้ารหัสในไพ ธ อนโดยใช้ "utf-16-le" พร้อมกับ 0xff 0xef BOM ที่ได้รับการเติมไว้ล่วงหน้าและใช้แท็บเป็นตัวคั่น ฉันต้องเขียน BOM ด้วยตนเองจากนั้นใช้ "utf-16-le" แทน "utf-16" มิฉะนั้นแต่ละตัวเข้ารหัส () เตรียม BOM ให้กับทุกแถวที่เขียนเป็นขยะในคอลัมน์แรกของ บรรทัดที่สองและหลัง

ไม่สามารถบอกได้ว่า UTF-16 จะทำงานโดยไม่ติดตั้ง sp ใด ๆ หรือไม่เนื่องจากฉันไม่สามารถย้อนกลับไปได้ในตอนนี้ ถอนหายใจ

นี่คือบน windows ไม่ทราบเกี่ยวกับ office สำหรับ MAC

สำหรับทั้งสองกรณีการทำงานการนำเข้าจะทำงานเมื่อเรียกใช้การดาวน์โหลดโดยตรงจากเบราว์เซอร์และตัวช่วยสร้างการนำเข้าข้อความจะไม่เกิดการขัดจังหวะ


ทำงานบน Excel 2011 สำหรับ Mac ด้วย
อดัม

ขอบคุณสำหรับการโพสต์ของคุณใช้ utf-16le ก็โอเคแม้ว่าคุณจะไม่ได้ติดตั้ง office 2007 sp3 แต่ BOM ควรเป็น 0xFF 0xFE
zhaozhi

4

อย่างที่ Fregal บอกว่า \ uFEFF เป็นหนทางไป

<%@LANGUAGE="JAVASCRIPT" CODEPAGE="65001"%>
<%
Response.Clear();
Response.ContentType = "text/csv";
Response.Charset = "utf-8";
Response.AddHeader("Content-Disposition", "attachment; filename=excelTest.csv");
Response.Write("\uFEFF");
// csv text here
%>

1
เพียงแค่ดูและดูว่าตัวคั่นแท็บของคุณถูกละเว้นใน Excel 2007 อย่างไรเมื่อคุณใช้ BOM คุณต้องคิดอะไรมากกว่านี้
Christiaan Westerbeek

3

ฉันยังสังเกตเห็นว่าคำถามนั้น "ตอบแล้ว" เมื่อไม่นานมานี้ แต่ฉันไม่เข้าใจเรื่องราวที่กล่าวว่าคุณไม่สามารถเปิดไฟล์ csv ที่เข้ารหัส utf8 ได้สำเร็จใน Excel โดยไม่ต้องใช้ตัวช่วยสร้างข้อความ

ประสบการณ์ที่สามารถทำซ้ำได้ของฉัน: พิมพ์Old MacDonald had a farm,ÈÌÉÍØลงใน Notepad กด Enter แล้วบันทึกเป็น (ใช้ตัวเลือก UTF-8)

ใช้ Python เพื่อแสดงว่ามีอะไรอยู่ในนั้นบ้าง:

>>> open('oldmac.csv', 'rb').read()
'\xef\xbb\xbfOld MacDonald had a farm,\xc3\x88\xc3\x8c\xc3\x89\xc3\x8d\xc3\x98\r\n'
>>> ^Z

ดี. แผ่นจดบันทึกวาง BOM ไว้ด้านหน้า

ตอนนี้ไปที่ Windows Explorer ดับเบิลคลิกที่ชื่อไฟล์หรือคลิกขวาและใช้ "เปิดด้วย ... " และขึ้นปรากฏ Excel (2003) พร้อมจอแสดงผลตามที่คาดไว้


@Cocowalla: ดีฉันเพิ่งลอง (อีกครั้งฉันทดสอบก่อนโพสต์) และทำงานกับ Excel 2007 (ซึ่งเป็นสิ่งที่ฉันใช้อยู่ตอนนี้) คุณทำopen('oldmac.csv', 'rb').read()เพื่อยืนยันการป้อนข้อมูลของคุณ?
John Machin

ฉันไม่ได้ลองกับ Excel 2007 (ฉันรู้ว่า Excel 2007 อ่านไฟล์ UTF-8 ที่มี BOM ได้ดี) ฉันลองใช้ Excel 2003
Cocowalla

@Cocowalla: มันทำงานได้ดีสำหรับฉันกับ Excel 2003 เมื่อฉันมีมัน แน่ใจหรือไม่ว่าคุณมี Service Pack รุ่นล่าสุดสำหรับ Excel 2003 คุณยืนยันการป้อนข้อมูลตามที่ฉันแนะนำหรือไม่
John Machin

ฉันตรวจสอบว่าแผ่นจดบันทึกได้ติด BOM ไว้ที่จุดเริ่มต้นของไฟล์ แต่ฉันใช้ Excel 2003 SP2 (มี SP3 ให้ใช้) - ดังนั้นฉันเดาว่านี่ใช้ได้เฉพาะใน SP3
Cocowalla

2

คุณสามารถบันทึกไฟล์ html ด้วยส่วนขยาย 'xls' และการเน้นเสียงจะทำงานได้ (อย่างน้อยปี 2007 ก่อนหน้า)

ตัวอย่าง: บันทึกสิ่งนี้ (โดยใช้บันทึกเป็น utf8 ใน Notepad) เป็น test.xls:

<html>
<meta http-equiv="Content-Type" content="text/html" charset="utf-8" />
<table>
<tr>
  <th>id</th>
  <th>name</th>
</tr>
<tr>
 <td>4</td>
 <td>Hélène</td>
</tr>
</table>
</html>

ตัวเลือกที่น่าสนใจ มันเปิดข้อความที่ถูกต้อง แต่ด้วยเหตุผลบางอย่างทุกหน้าเป็นสีขาวอย่างสมบูรณ์ หากไม่มีบรรทัดสเปรดชีตแบบคลาสสิกจะทำให้แถวและคอลัมน์ (สำนักงานสำหรับ mac) คั่นได้อย่างดีที่สุด
Sebastian Sastre

ใช่สิ่งเดียวกันใน Office 2007 บน Windows มันทำให้ฉันประหลาดใจเสมอว่ามันใช้งานได้จริง (หมายเหตุถ้าคุณเพิ่มborder="1"ไปยังตารางที่คุณทำจะได้รับสาย แต่เพียงรอบ 4 เซลล์ :)
Benjol

1

นี่เป็นเพียงคำถามของการเข้ารหัสอักขระ ดูเหมือนว่าคุณกำลังส่งออกข้อมูลของคุณในรูปแบบ UTF-8: éใน UTF-8 เป็นลำดับสองไบต์ 0xC3 0xA9 ซึ่งเมื่อตีความใน Windows-1252 จะเป็น เมื่อคุณนำเข้าข้อมูลของคุณไปยัง Excel ตรวจดูให้แน่ใจว่าการเข้ารหัสอักขระที่คุณใช้คือ UTF-8


ฉันยืนยันว่าข้อมูลเป็น UTF-8 ฉันจะใส่อะไรลงในไฟล์เพื่อให้ excel รู้ว่าข้อมูลของฉันคือ utf-8 (BOM?)
Freddo411

ผมคิดว่าคุณต้องเปลี่ยนการเข้ารหัสไฟล์ Excel ใช้เพจรหัสเริ่มต้นของระบบไปยังไฟล์ CSV จับ
albertein

ฉันไม่แน่ใจทั้งหมดเนื่องจากฉันไม่ได้ติดตั้ง Excel ไว้ในเครื่องที่ฉันใช้อยู่ในปัจจุบัน แต่ด้วย OpenOffice จะมีช่องแบบเลื่อนลงสำหรับการเข้ารหัสอักขระเมื่อคุณนำเข้าไฟล์ CSV จากนั้นเลือก Unicode (UTF-8)
Adam Rosenfield

Excel ไม่มี AFAIK ที่เลื่อนลง
albertein

1

รูปแบบ CSV ถูกนำมาใช้เป็น ASCII ไม่ใช่ยูนิโค้ดใน Excel ดังนั้นจึงเป็นการกำกับการออกเสียง เราประสบปัญหาเดียวกันซึ่งเป็นวิธีที่ฉันติดตามว่ามาตรฐาน CSV อย่างเป็นทางการได้รับการกำหนดให้เป็น ASCII ใน Excel


ที่จริงแล้ว CSV ไม่ได้ถูกผูกไว้กับการเข้ารหัสที่เฉพาะเจาะจง มันเป็น Excel ที่สมมติว่า ASCII en.wikipedia.org/wiki/Comma-separated_values
spoulson

นั่นคือสิ่งที่ฉันพูด "ใช้งานเป็น ASCII ใน Excel", "CSV ถูกกำหนดให้ใช้เป็น ASCII ใน Excel" ไม่แน่ใจว่าคุณกำลังทำสิ่งใดในขณะที่คุณเห็นด้วยกับฉัน
เจฟฟ์เยตส์

2
จริงๆแล้วคุณพูดว่า "รูปแบบ CSV ถูกใช้เป็น ASCI" ฉันคิดว่าเป็นที่มาของความสับสน
RichardOD

1

Excel 2007 อ่าน UTF-8 อย่างถูกต้องด้วย BOM (EF BB BF) เข้ารหัส csv

Excel 2003 (และอาจก่อนหน้านี้) อ่าน UTF-16LE ด้วย BOM (FF FE) แต่ใช้ TAB แทนเครื่องหมายจุลภาคหรืออัฒภาค


1

ฉันสามารถรับ CSV เพื่อแยกวิเคราะห์อย่างถูกต้องใน Excel 2007 เป็น UTF-16 แบบแยกแท็บที่คั่นด้วยแท็บเริ่มต้นด้วยเครื่องหมายลำดับไบต์ที่ถูกต้อง


1

การเขียน BOM ไปยังไฟล์ CSV เอาต์พุตนั้นได้ผลสำหรับฉันใน Django:

def handlePersoonListExport(request):
    # Retrieve a query_set
    ...

    template = loader.get_template("export.csv")
    context = Context({
        'data': query_set,
    })

    response = HttpResponse()
    response['Content-Disposition'] = 'attachment; filename=export.csv'
    response['Content-Type'] = 'text/csv; charset=utf-8'
    response.write("\xEF\xBB\xBF")
    response.write(template.render(context))

    return response

สำหรับข้อมูลเพิ่มเติมhttp://crashcoursing.blogspot.com/2011/05/exporting-csv-with-special-characters.htmlขอขอบคุณพวกคุณ!


ใช่นี้ทำงานให้ฉันกับ Excel 2010 ในการใช้งาน Java printWriter.print('\ufeff')เห็นวิธีการเพิ่ม UTF-8 BOM ใน java
tsauerwein

1

วิธีแก้ไขปัญหาอื่นที่ฉันพบคือเพียงเพื่อเข้ารหัสผลลัพธ์เป็นรหัส Windows Page 1252 (Windows-1252 หรือ CP1252) สิ่งนี้จะทำเช่นโดยการตั้งค่าContent-Typeอย่างเหมาะสมกับสิ่งที่ชอบtext/csv; charset=Windows-1252และการตั้งค่าการเข้ารหัสตัวละครของกระแสการตอบสนองในทำนองเดียวกัน


ขอบคุณสำหรับสิ่งนี้ ทำงานบน excel windows และ mac ฉันใช้มัน
Sebastian Sastre

สิ่งนี้จะใช้ได้ก็ต่อเมื่อช่วงอักขระที่ไม่ใช่ ASCII ของคุณอยู่ใน Windows-1252 ทั้งหมด ตัวอย่างเช่นไม่มีเกาหลี / จีน / ญี่ปุ่นไม่มีไซริลลิกเป็นต้น แต่ฉันเดาว่าคุณจะเลื่อนไปกับภาษายุโรปตะวันตกส่วนใหญ่
Tom McClure

1

โปรดทราบว่าการรวม UTF-8 BOM ไม่จำเป็นต้องเป็นความคิดที่ดี - Excel เวอร์ชัน Mac ไม่สนใจและจะแสดง BOM เป็น ASCII …ตัวละครที่น่ารังเกียจสามตัวที่จุดเริ่มต้นของฟิลด์แรกในสเปรดชีตของคุณ ...


ฉันรู้ว่าความคิดเห็นนี้คือ 6 ปีต่อมา แต่ FWIW: การใช้ JavaScript เพื่อดาวน์โหลดไฟล์เช่น'\uFEFF' + myCsvStringงานตามที่คาดไว้ใน Mac Excel 15.19.1 (2016)
bobjones

0

ตรวจสอบการเข้ารหัสที่คุณสร้างไฟล์เพื่อให้ excel แสดงไฟล์อย่างถูกต้องคุณต้องใช้เพจรหัสเริ่มต้นของระบบ

คุณใช้ภาษาอะไร ถ้าเป็น. Net คุณจะต้องใช้ Encoding.Default ขณะสร้างไฟล์


ข้อมูลการส่งออกเป็น utf-8 ฉันกำลังเขียนไฟล์ส่งออกด้วย php 5
Freddo411

แปลงข้อมูลเป็น Windows 1252 เพจผมไม่แน่ใจว่าจะ acomplish มันด้วย php
albertein

0

หากคุณมีรหัสดั้งเดิมใน vb.net เหมือนฉันมีรหัสต่อไปนี้ทำงานให้ฉัน:

    Response.Clear()
    Response.ClearHeaders()
    Response.ContentType = "text/csv"
    Response.Expires = 0
    Response.AddHeader("Content-Disposition", "attachment; filename=export.csv;")
    Using sw As StreamWriter = New StreamWriter(Context.Response.OutputStream, System.Text.Encoding.Unicode)
        sw.Write(csv)
        sw.Close()
    End Using
    Response.End()

0

ฉันพบวิธีแก้ปัญหาแล้ว นี่เป็นแฮ็คที่น่ารังเกียจ แต่ใช้งานได้: เปิดเอกสารด้วยOpen Officeจากนั้นบันทึกลงในรูปแบบ excel ใด ๆ ผลลัพธ์.xlsหรือ.xlsxจะแสดงอักขระที่เน้นเสียง


1
OP บอกว่าเขากำลังส่งออกทางโปรแกรมดังนั้นเขาจึงไม่มองหาโซลูชันที่ต้องการการแทรกแซงด้วยตนเอง
Christiaan Westerbeek

0

ด้วย Ruby 1.8.7 ฉันเข้ารหัสทุกฟิลด์เป็น UTF-16 และทิ้ง BOM (อาจจะ)

รหัสต่อไปนี้สกัดจาก active_scaffold_export:

<%                                                                                                                                                                                                                                                                                                                           
      require 'fastercsv'                                                                                                                                                                                                                                                                                                        
      fcsv_options = {                                                                                                                                                                                                                                                                                                           
        :row_sep => "\n",                                                                                                                                                                                                                                                                                                        
        :col_sep => params[:delimiter],                                                                                                                                                                                                                                                                                          
        :force_quotes => @export_config.force_quotes,                                                                                                                                                                                                                                                                            
        :headers => @export_columns.collect { |column| format_export_column_header_name(column) }                                                                                                                                                                                                                                
      }                                                                                                                                                                                                                                                                                                                          

      data = FasterCSV.generate(fcsv_options) do |csv|                                                                                                                                                                                                                                                                           
        csv << fcsv_options[:headers] unless params[:skip_header] == 'true'                                                                                                                                                                                                                                                      
        @records.each do |record|                                                                                                                                                                                                                                                                                                
          csv << @export_columns.collect { |column|                                                                                                                                                                                                                                                                              
            # Convert to UTF-16 discarding the BOM, required for Excel (> 2003 ?)                                                                                                                                                                                                                                     
            Iconv.conv('UTF-16', 'UTF-8', get_export_column_value(record, column))[2..-1]                                                                                                                                                                                                                                        
          }                                                                                                                                                                                                                                                                                                                      
        end                                                                                                                                                                                                                                                                                                                      
      end                                                                                                                                                                                                                                                                                                                        
    -%><%= data -%>

บรรทัดสำคัญคือ:

Iconv.conv('UTF-16', 'UTF-8', get_export_column_value(record, column))[2..-1]

-2

เปิดไฟล์ csv ด้วย notepad ++ clic บน Encode เลือกแปลงเป็น UTF-8 (ไม่แปลงเป็น UTF-8 (ไม่มี BOM)) บันทึกเปิดโดย clic สองครั้งด้วย excel หวังว่าจะช่วย Christophe GRISON


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