เปิดไฟล์ export ใน Excel แล้ว สมศรี กลายเป็น เธชเธกเธจเธฃเธต อาการ CSV ภาษาไทยเพี้ยนแบบนี้ไม่ใช่ไฟล์เสีย ไฟล์ถูกทุกไบต์ แต่ Excel อ่านด้วยตารางผิดเล่ม บทความนี้กางถึงระดับไบต์ว่าเกิดอะไรขึ้น แล้วบอกวิธีแก้ทั้งฝั่งคนเปิดไฟล์และคนเขียนระบบ export
CSV ภาษาไทยเพี้ยนเพราะอะไร ดูกันถึงระดับไบต์
ไฟล์ข้อความไม่ได้เก็บตัวอักษร มันเก็บตัวเลข ส่วนที่บอกว่าเลขไหนแปลว่าตัวอักษรอะไรเรียกว่า encoding ซึ่งไม่ได้อยู่ในไฟล์ คนเปิดต้องเดาเอง ลองดู ส ตัวเดียว ในระบบเว็บสมัยใหม่ที่ใช้ UTF-8 ตัวอักษรไทย 1 ตัวกิน 3 ไบต์ ส เขียนออกมาเป็น E0 B8 AA แต่ Excel บน Windows ภาษาไทยเปิด .csv ด้วยรหัสประจำเครื่อง Windows-874 ที่เก็บไทย 1 ตัวต่อ 1 ไบต์ มันจึงอ่าน E0 B8 AA แยกเป็น 3 ตัว E0 คือ เ ตามด้วย B8 คือ ธ และ AA คือ ช
ผลลัพธ์คือ ส หนึ่งตัวกลายเป็น เธช สามตัว สมศรี จึงกลายเป็น เธชเธกเธจเธฃเธต ที่ทุกคนคุ้นตา ข้อมูลไม่ได้หายแม้แต่ไบต์เดียว มีแต่คนอ่านที่ใช้ตารางแปลผิดเล่ม
กล่องสี่เหลี่ยมที่ปนอยู่ก็เรื่องเดียวกัน ตาราง Windows-874 มีตัวอักษรไม่ครบ 256 ช่อง ไบต์บางตัวจึงไม่มีตัวอักษรให้แสดง Excel เลยวาดกล่องแทน
ไฟล์ไม่ได้เสีย ไฟล์แค่ไม่ได้บอกว่าตัวเองเป็นภาษาอะไร
ทำไมบันทึกเป็น UTF-8 แล้วก็ยังเพี้ยนอยู่ดี
นี่คือจุดที่คนเสียเวลาที่สุด สาเหตุคือ Excel บน Windows ไม่ได้ตรวจเนื้อไฟล์เพื่อเดา encoding ตอนดับเบิลคลิก สิ่งที่มันใช้ตัดสินคือไฟล์ขึ้นต้นด้วยลายเซ็น 3 ไบต์ EF BB BF หรือไม่ ลายเซ็นนี้เรียกว่า BOM หน้าที่ของมันคือประกาศว่าไฟล์นี้เป็น UTF-8 ไฟล์ที่ไม่มี BOM ถูกเปิดด้วย Windows-874 ภาษาไทยเพี้ยน ส่วนไฟล์ที่มี BOM เปิดถูกทันทีไม่ต้องตั้งค่าอะไร
ระบบจำนวนมาก export เป็น UTF-8 ไม่มี BOM เพราะซอฟต์แวร์ส่วนใหญ่ใช้แบบนั้นเป็นค่าเริ่มต้น แต่จากงานที่เราเจอ ผู้ใช้ฝั่งธุรกิจไทยเปิด CSV ด้วย Excel เป็นหลัก
วิธีแก้ 3 ทาง เลือกตามว่าคุณอยู่ตรงไหนของปัญหา
ถ้าคุณคือคนที่ได้ไฟล์มาและเปิดไม่ออก ทางเร็วสุดคือเติม BOM ให้ไฟล์ แต่ไฟล์ที่เป็นข้อมูลลูกค้าหรือพนักงาน อย่าอัปโหลดขึ้นเว็บแปลงไฟล์ที่ไหนก็ได้ ใช้เครื่องมือที่ทำงานในเบราว์เซอร์และไม่ส่งไฟล์ออกจากเครื่อง เช่น เครื่องมือแก้ CSV ภาษาไทยเพี้ยน ใน LightUtils ชุดเครื่องมือที่เราสร้างและดูแลเอง อ่านเขียนไฟล์ในเครื่องคุณล้วนๆ เปิดแท็บ Network ดูได้ว่าไม่มีอะไรวิ่งออกไป รายละเอียดในหน้า security
ถ้าเปิดครั้งเดียวพอ ไม่อยากแก้ไฟล์ อย่าดับเบิลคลิก ให้เข้า Data เลือก From Text/CSV แล้วตั้ง File Origin เป็น 65001 Unicode UTF-8 วิธีนี้ Excel ถามก่อน ไม่เดาเอง
ถ้าคุณควบคุมระบบ export ได้ แก้ที่ต้นทาง จบที่เดียวทุกไฟล์ที่ export ออกไป ดูหัวข้อถัดไป
ถ้าคุณเป็นคนเขียนระบบ export แก้ที่นี่จบเลย
กฎมีข้อเดียว เขียน BOM นำหน้าไฟล์ CSV ทุกไฟล์ที่รู้ว่าคนจะเปิดด้วย Excel โดยเขียน 3 ไบต์ EF BB BF ก่อนบรรทัดแรก หรือในภาษาที่ตั้งชื่อ encoding ได้ ให้ระบุเป็น utf-8-sig แทน utf-8 ส่วน Content-Type text/csv; charset=utf-8 ตั้งให้ถูกตอนส่งผ่าน HTTP อันนี้ช่วยฝั่งเบราว์เซอร์ ไม่ใช่ตัวแก้ Excel
ตัวอ่าน CSV ยุคใหม่ส่วนใหญ่ข้าม BOM ให้อัตโนมัติ ข้อควรระวังคือสคริปต์เก่าที่อ่านหัวคอลัมน์แบบเทียบสตริงตรงๆ ชื่อคอลัมน์แรกจะมีอักขระล่องหนติดอยู่ข้างหน้า
ถ้าลูกค้ายืนกรานต้องเป็น Windows-874 เพราะมีระบบเก่ารออ่าน ให้ทำเป็นตัวเลือกตอน export ไม่ใช่ค่าเริ่มต้น และเตือนบนหน้าจอว่าตัวอักษรที่ไม่ใช่ไทยกับอังกฤษจะหาย
กับดักถัดไปที่แรงกว่าเดิม เลขศูนย์นำหน้าหาย
พอแก้เรื่องภาษาไทยจบ ปัญหาที่สองจะโผล่ทันทีและอันตรายกว่า เพราะมันไม่ได้ดูผิด Excel เดาชนิดข้อมูลของทุกคอลัมน์เองโดยไม่ถาม รุ่นที่รองรับมีตัวเลือกปิดใน Options แต่ต้องไปตั้งเองที่เครื่องคนเปิดทีละเครื่อง เบอร์โทร 0812345678 กลายเป็น 812345678 เลขที่ยาวเกิน 15 หลักโดนปัดท้ายเป็นศูนย์ กด save แล้วค่าจริงกู้ไม่ได้ รหัสสินค้า 00123 เหลือ 123 ค่าอย่าง 3/4 กลายเป็นวันที่
จุดอันตรายคือภาษาไทยเพี้ยนแล้วเห็นทันที แต่เบอร์โทรที่ศูนย์หายยังดูเหมือนเบอร์โทร แล้วไหลเข้าฐานข้อมูลเงียบๆ ข้อมูลที่ต้องคงรูปจึงควรส่งเป็น .xlsx ที่ระบุคอลัมน์เป็นข้อความไว้ในไฟล์
เริ่มยังไงต่อ
ถ้าเรื่องนี้เกิดเป็นครั้งคราว แก้ที่ไฟล์ก็พอ แต่ถ้าเกิดทุกเดือนกับ report เดิม ปัญหาไม่ได้อยู่ที่ไฟล์ มันอยู่ที่ขั้นตอนที่ยังต้องมีคนนั่งเปิดไฟล์ ตั้งค่า กด save ใหม่ทุกรอบ จุดนั้นควรเป็นงานอัตโนมัติ ให้ระบบดึงข้อมูล แปลง และส่งไฟล์ที่เปิดถูกตั้งแต่แรกให้คนที่ต้องใช้ เราเล่าหลักคิดไว้ใน Workflow Automation คืออะไร อยากให้ช่วยประเมินจากงานจริงของคุณ ดูแนวทางที่ Workflow Automation คุยรอบแรกฟรี ไม่มีข้อผูกมัด
คำถามที่พบบ่อย
CSV ภาษาไทยเพี้ยนใน Excel แก้ยังไงเร็วที่สุด
เติม BOM สามไบต์ EF BB BF ไว้หน้าไฟล์ แล้ว Excel บน Windows จะเปิดถูกทันทีโดยไม่ต้องตั้งค่า ถ้าไม่อยากแก้ไฟล์ ให้เข้า Data แล้ว From Text/CSV แล้วตั้ง File Origin เป็น 65001 Unicode UTF-8
บันทึกเป็น UTF-8 แล้วทำไมยังเพี้ยน
เพราะตอนดับเบิลคลิกเปิด .csv ตรงๆ Excel บน Windows ไม่ได้ตรวจเนื้อไฟล์เพื่อเดา encoding สิ่งที่มันใช้ตัดสินคือลายเซ็น BOM นำหน้าไฟล์ ไฟล์ UTF-8 ที่ไม่มี BOM จึงถูกเปิดด้วยรหัสประจำเครื่องคือ Windows-874
BOM คืออะไร ใส่แล้วทำให้ระบบอื่นพังไหม
BOM คือ 3 ไบต์ที่วางไว้หน้าไฟล์เพื่อประกาศว่าไฟล์นี้เป็น UTF-8 ตัวอ่าน CSV ยุคใหม่ส่วนใหญ่ข้ามให้อัตโนมัติ จุดที่ต้องระวังคือสคริปต์เก่าที่เทียบชื่อคอลัมน์แบบตรงตัว ชื่อคอลัมน์แรกจะมีอักขระล่องหนติดอยู่ข้างหน้า
ทำไมเบอร์โทรใน CSV ศูนย์หน้าหายเมื่อเปิดด้วย Excel
Excel เดาชนิดข้อมูลของทุกคอลัมน์เองโดยไม่ถาม ค่าที่เป็นตัวเลขล้วนถูกอ่านเป็นจำนวน ศูนย์นำหน้าจึงหาย และเมื่อกด save ค่าเดิมหายถาวร ทางแก้คือส่งเป็น .xlsx ที่กำหนดคอลัมน์เป็นข้อความไว้ในไฟล์ หรือปิด Automatic Data Conversion ใน Options ของ Excel รุ่นที่รองรับ






