ไฟล์ CSV UTF-8 ควรมี BOM (เครื่องหมายคำสั่งซื้อแบบไบต์) หรือไม่


37

ของเราซอฟแวร์สายของธุรกิจที่จะช่วยให้ผู้ใช้สามารถบันทึกข้อมูลบางอย่างเป็นCSV เนื่องจากมีรูปแบบที่แตกต่างกันจำนวนมาก (ทั้งหมดเรียกว่า "CSV") ที่ใช้งานอยู่ใน wild เราจึงต้องตัดสินใจว่า "รูปแบบเริ่มต้น" ควรเป็นอย่างไร

  • เกี่ยวกับสาย / แยกสนามและหนีออกมามีความเป็นมาตรฐานที่เราสามารถใช้: RFC 4180

  • เกี่ยวกับการเข้ารหัสข้อความUTF-8ดูเหมือนว่าจะเกิดขึ้นในทศวรรษที่ผ่านมาเป็น "รูปแบบไฟล์ข้อความเริ่มต้น" ดังนั้นเราจะใช้มัน

คำถามหนึ่งที่เปิดค้างอยู่คือ: เราควรเพิ่มBOMในช่วงเริ่มต้นหรือไม่? ฉันได้อ่านความคิดเห็นและข้อดี / ข้อเสียหลายประการเกี่ยวกับการใช้ BOM โดยทั่วไปแล้ว แต่มีคำแนะนำ "เป็นทางการ" หรืออย่างน้อยฉันทามติชุมชนบางประการเกี่ยวกับการใช้ BOM ในไฟล์ CSV หรือไม่


7
หากมี BOM แสดงว่าไม่ใช่ UTF-8 แต่โปรแกรมต้องการรูปแบบใด หากพวกเขาต้องการ BOM (ส่วนใหญ่เป็น micro-sloth) คุณต้องเพิ่มมันเข้าไป แต่ UTF-8 + BOM ≠ UTF-8
ctrl-alt-delor

3
แม้ว่า CSV จะง่ายต่อการสร้าง แต่ก็มีปัญหาเรื่องความเข้ากันได้มากมายโดยเฉพาะอย่างยิ่งถ้าคุณหลงทางจาก ASCII 7 บิตที่บริสุทธิ์ซึ่งฉันขอแนะนำอย่างยิ่งให้คุณสร้าง XLSX จริงถ้าเป้าหมายเปิดให้ผู้ใช้เปิด ใน Excel (แทนที่จะนำเข้าใหม่ในซอฟต์แวร์อื่น ๆ ซึ่งในกรณีนี้คุณจะต้องให้ตัวเลือกสำหรับตัวแยกการเข้ารหัส ฯลฯ ) มีห้องสมุดสำหรับภาษาส่วนใหญ่และคุณจะช่วยให้คุณประหยัดเวลาและผู้ใช้
jcaron

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

2
เหตุใดจึงสำคัญหากเปิดอย่างถูกต้องใน Excel ไม่มีอะไรในคำถามระบุ Excel จะต้องสามารถที่จะแยกไฟล์ที่สร้างขึ้น ...
rubenvb

คำตอบ:


55

ไม่ใช่สำหรับ UTF-8แต่ดูคำเตือนต่าง ๆ ในความคิดเห็น

มันเป็นเรื่องที่ไม่จำเป็น (UTF-8 มีคำสั่งไบต์) ซึ่งแตกต่างจาก UTF-16/32 และไม่แนะนำให้ใช้ในมาตรฐาน Unicode นอกจากนี้ยังค่อนข้างหายากที่จะเห็น UTF-8 ที่มี BOM "อยู่ในป่า" ดังนั้นหากคุณไม่มีเหตุผลที่ถูกต้อง (เช่นตามที่แสดงความคิดเห็นคุณจะทำงานกับซอฟต์แวร์ที่คาดว่า BOM) ฉันขอแนะนำวิธี BOM-less .

Wikipediaกล่าวถึงซอฟต์แวร์ส่วนใหญ่ของ Microsoft ที่ใช้บังคับและคาดว่าจะเป็น BOM แต่ถ้าคุณไม่ได้ทำงานกับมันอย่าใช้มัน


28
นอกจากนี้ยังมีซอฟต์แวร์ที่แพร่หลายซึ่งต้องการ BOM: Excel ต้องการ BOM เพื่อระบุไฟล์ CSV อย่างถูกต้องเป็น UTF-8 แทนที่จะเป็น "ANSI" นั่นคือโลแคลความเข้ากันได้ในท้องถิ่น (แต่ Excel ยังทำสิ่งที่แปลกเมื่อบันทึกไฟล์ดังกล่าวดังนั้นเราแนะนำให้ผู้ใช้ใช้การส่งออก Excel "ของจริง" แทนการส่งออก CSV หากพวกเขาต้องการเปิดไฟล์ด้วย Excel)
Heinzi

21
@ Heinzi ฉันเรียนรู้เมื่อนานมาแล้วว่าคุณไม่สามารถชนะได้จริงๆเมื่อทำงานกับ CSV และ Excel มันเป็นเครื่องอ่าน CSV ที่มีหมัด น่าเสียดายที่มันเป็นสิ่งที่ผู้ใช้ทั่วไปคาดหวัง
ท่อ

9
@Voo: การร้องขอ BOM สำหรับ UTF-8 เป็นการละเมิดมาตรฐานอย่างแน่นอนโดยพิจารณาว่าเป็น " ไม่จำเป็นหรือไม่แนะนำ "
Deduplicator

12
@Deduplicator: ระบบ MS-DOS และ Windows มีฐานข้อความขนาดใหญ่ในการเข้ารหัสอื่นที่ไม่ใช่ UTF-8 แอปพลิเคชันคุณภาพอนุญาตให้ผู้ใช้ระบุวิธีการเข้ารหัสไฟล์ข้อความเมื่อเปิด แต่มักจะมีตัวเลือก "อัตโนมัติ" หากผู้ใช้เลือก "UTF-8" ไฟล์ UTF-8 จะเปิดขึ้นอย่างถูกต้องโดยมีหรือไม่มี BOM หากผู้ใช้เลือก "อัตโนมัติ" ไฟล์ UTF-8 บางไฟล์ที่ไม่มี BOM อาจถูกระบุว่าใช้การเข้ารหัสแบบอื่น ผมไม่แน่ใจว่าสิ่งหนึ่งจะคาดหวังว่าโปรแกรมที่จะทำแตกต่างกันเนื่องจากแฟ้มที่ "misidentified" อาจจะเป็นบิตสำหรับบิตเหมือนกันกับ ...
SuperCat

7
@Voo: นั่นขัดแย้งกับข้อกำหนดเฉพาะรูปแบบอื่น ๆ อีกมากมายซึ่ง BOM นั้นผิดกฎหมาย ตัวอย่างเช่นเชลล์สคริปต์ที่มี BOM ก่อนหน้านั้น#!จะไม่ถูกต้อง ที่ดีที่สุด BOM ใน UTF-8 คือ "ได้รับอนุญาตเมื่อไม่มีข้อกำหนดเฉพาะรูปแบบ / แอปพลิเคชันห้าม", "ไม่อนุญาต" และไม่ควรใช้ มาตรฐานมีความชัดเจนจริง ๆ เกี่ยวกับไม่ควร
..

8

ยังไม่มีข้อตกลง AFAIK ที่แพร่หลายแม้ว่า UTF-8 จะได้รับการยอมรับโดยทั่วไป

BOM เป็นสิ่งประดิษฐ์อันยิ่งใหญ่:

มันมองไม่เห็น (พื้นที่ว่างที่มีความกว้างเป็นศูนย์)

ซอฟต์แวร์บางตัวอาจแตกชื่อคอลัมน์แรกไม่ได้มีเพียงตัวอักษร แต่มี BOM แปลก ๆ อยู่ข้างหน้า

บรรทัดส่วนหัวอาจถูกคัดลอกสำหรับบรรทัดค่าที่ทำลายค่าแรก

ซอฟต์แวร์ Windows บางตัวจำเป็นต้องใช้เพื่อแยกความแตกต่างระหว่างหนึ่งในการเข้ารหัส ANSI ที่ใช้โดยเครื่อง Windows ท้องถิ่นนั้นและ UTF-8 แผ่นจดบันทึก, Excel

ดังนั้นสิ่งที่น่าเศร้าก็ควรสนับสนุน BOM อาจจะเป็นตัวเลือก

ใช้รูปแบบการตั้งชื่อสำหรับไฟล์ (...- utf8.txt, ...- utf8bom.txt)


ในหลายกรณีเราสามารถใช้HTMLเป็นทางเลือกในการส่งออก อนุญาตให้ตั้งค่าการเข้ารหัสในไฟล์ คุณสมบัติพิเศษคือการระบายสีพื้นหลัง / เบื้องหน้าของแถวและเซลล์ ซึ่งเพิ่มความสูงคุณภาพของการส่งออก


15
การจัดรูปแบบว่า "เพิ่มคุณภาพของการส่งออก" ให้สูงขึ้นหรือไม่นั้นขึ้นอยู่กับการใช้ไฟล์อย่างตั้งใจ CSV มักจะใช้เป็นรูปแบบที่เครื่องอ่านง่ายและการทำให้ผู้รับแยกวิเคราะห์ HTML แทนจะเป็นข้อเสียใหญ่ในกรณีนี้
IMSoP

5
หากคุณกำลังเลือกรูปแบบการตั้งชื่อให้คำนึงถึงผู้ชม -utf8-windows.csvจะดีกว่า. เกือบทุกคนรู้ว่า Windows คืออะไรในบริบทของคอมพิวเตอร์ แต่มีผู้ใช้น้อยกว่าที่รู้ว่า Byte Order Mark คืออะไร
MSalters

2
@Davislor ใช่ถ้ามันเป็นมาตรฐานที่รู้จักกันในวงกว้าง มิฉะนั้นรายงานข้อผิดพลาดจะเกิดขึ้นเกี่ยวกับtschüßการเป็นขยะขณะที่tschüßควรเขียน ใน StackOverflow ข้อผิดพลาดด้านไอทีจำนวนมากเกี่ยวกับการเข้ารหัส ผู้ใช้จะพบปัญหาเช่นกัน
Joop Eggen

3
@JoopEggen "มาตรฐานการสื่อสารที่รู้จักกันแพร่หลาย" ในชุมชนใด ฉันได้ทำการพัฒนาซอฟต์แวร์มาเกือบ 10 ปีแล้วและฉันไม่เคยเห็นมาก่อน - ไม่ใช่แม้กระทั่งบน windows และไม่แน่นอนบน Linux หรือ OSX ที่คุณมักจะจัดการกับ utf-8
Cubic

1
@ จัสตินไทม์ใช่ตั้งแต่หลายปีมาแล้ว แต่ไม่ใช่ก่อนหน้านี้ นักพัฒนา MS ไม่ได้แย่ขนาดนั้น (การรองรับ Posix ตอนนี้รองรับ UTF-8)
Joop Eggen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.