คู่มือ

ไฟล์ CSV เป็นภาษาต่างดาว? สาเหตุและวิธีแก้ตัวอักษรเพี้ยน

ทีมงาน Openerอ่าน 14 นาที

ตัวอักษรแปลก ๆ อย่าง “é” หรือ “Сума” หมายความว่าไฟล์ CSV ถูกบันทึกด้วยการเข้ารหัสข้อความแบบหนึ่ง แต่ถูกเปิดราวกับเป็นอีกแบบ ตัวอักษรยังอยู่ในไฟล์ครบ แค่ถูกถอดรหัสผิด ให้เปิดด้วยการเข้ารหัสที่ถูกต้อง (โปรแกรมดู CSV ตรวจจับให้อัตโนมัติ) แล้วบันทึกสำเนาเป็น UTF-8 ส่วนเครื่องหมายคำถาม (“????”) เป็นอีกเรื่องหนึ่ง มักแปลว่าตัวอักษรหายไปตั้งแต่ตอนเขียนไฟล์แล้ว

การเข้ารหัสคืออะไร ฉบับหนึ่งนาที

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

สามแบบที่คุณจะเจอในไฟล์ส่งออกจากโปรแกรมบัญชีและธนาคาร

สำหรับไฟล์ภาษาไทยจากระบบรุ่นเก่า คุณอาจเจอ TIS-620 หรือ Windows-874 ด้วย ซึ่งเป็นการเข้ารหัสภาษาไทยแบบไบต์เดียว

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

อ่านภาษาต่างดาว: แต่ละแบบบอกอะไร

ลักษณะของตัวอักษรเพี้ยนเป็นเบาะแสว่าเกิดอะไรผิดพลาด

คุณเห็น ที่ควรเป็น เกิดอะไรขึ้น
é, ü, € é, ü, € ไฟล์ UTF-8 ถูกเปิดเป็น Windows-1252
Сума (มี Ð และ Ñ เต็มไปหมด) Сума ซีริลลิกแบบ UTF-8 ถูกเปิดเป็น Windows-1252
Ñóìà (อักษรละตินมีเครื่องหมายกำกับ) Сума ไฟล์ Windows-1251 ถูกเปิดเป็น Windows-1252
Cafй Café ไฟล์ Windows-1252 ถูกเปิดเป็น Windows-1251
� (รูปข้าวหลามตัดสีดำมี ?) ตัวอักษรใดก็ได้ ไฟล์การเข้ารหัสแบบเก่าถูกเปิดเป็น UTF-8
???? ตัวอักษรใดก็ได้ ตัวอักษรหายไปตอนบันทึกไฟล์

คู่อย่าง “Ô + อะไรสักตัว หรือ “Д/“Ñ” + อะไรสักตัว คือลายนิ้วมือของ UTF-8 ที่ถูกอ่านเป็นการเข้ารหัสแบบเก่า ตัวอักษรที่ไม่ใช่ภาษาอังกฤษแต่ละตัวใช้สองไบต์ใน UTF-8 และตารางแบบเก่าแสดงแต่ละไบต์เป็นสัญลักษณ์แยกกัน ภาษาไทยก็มีลายนิ้วมือคล้ายกัน คำว่า “ไทย” ในไฟล์ UTF-8 ที่ถูกเปิดเป็น Windows-1252 จะกลายเป็น ไทย คือมี “ด หรือ “๔ ซ้ำไปเรื่อย ๆ นี่เป็นข่าวดี เพราะไม่มีอะไรหาย การเปิดไฟล์เป็น UTF-8 ก็แก้ได้ ส่วนไฟล์ TIS-620 หรือ Windows-874 ที่ถูกเปิดเป็น Windows-1252 จะออกมาเป็นอักษรละตินมีเครื่องหมายกำกับ เช่น “ไทย” กลายเป็น ä·Â

เครื่องหมายคำถามล้วน ๆ เป็นข่าวร้าย มักเกิดเมื่อโปรแกรมพยายามบันทึกข้อความด้วยการเข้ารหัสที่ไม่มีช่องสำหรับตัวอักษรเหล่านั้น (เช่น ซีริลลิกหรือภาษาไทยลงใน Windows-1252) แล้วแทนที่ทุกตัวด้วย ? ตัวอักษรต้นฉบับไม่อยู่ในไฟล์แล้ว และไม่มีโปรแกรมไหนกู้คืนได้ วิธีแก้คือส่งออกใหม่จากระบบต้นทาง โดยเลือก UTF-8 หรือการเข้ารหัสตามภูมิภาคที่ถูกต้อง ถ้าหน้าต่างส่งออกมีให้เลือก

BOM: ทำไม Excel อ่าน UTF-8 ผิด

ไฟล์ UTF-8 อาจขึ้นต้นด้วยไบต์ที่มองไม่เห็นสามตัวที่เรียกว่า byte order mark (BOM) เป็นคำใบ้ที่บอกว่า “ไฟล์นี้เป็น UTF-8”

เมื่อคุณดับเบิลคลิก CSV, Excel พึ่งคำใบ้นี้อย่างมาก ถ้ามี BOM มักอ่าน UTF-8 ได้ถูกต้อง ถ้าไม่มี มักเดาว่าเป็นการเข้ารหัสแบบเก่าของเครื่องคุณ และนั่นคือที่มาที่ไฟล์ UTF-8 ดี ๆ จากธนาคารกลายเป็น “Сума” โปรแกรมอื่นบางตัวทำตรงกันข้าม คือแสดง BOM เป็นขยะอย่าง  ไว้หน้าหัวคอลัมน์แรก ถ้าคุณเห็นแบบนั้น แปลว่าไฟล์เป็น UTF-8 และ BOM ถูกแสดงออกมาเป็นข้อความ

วิธีที่ 1: เปิดด้วยการตรวจจับอัตโนมัติ

วิธีที่เร็วที่สุดคือให้เครื่องมือตรวจจับการเข้ารหัสให้ โปรแกรมดู CSV ของ Opener จะลอง UTF-8 ก่อน แล้วถอยไปใช้ Windows-1251 หรือ Windows-1252 ตามลักษณะของข้อความ ชื่อและรายละเอียดจึงแสดงถูกต้องโดยไม่ต้องผ่านตัวช่วยนำเข้า นอกจากนี้ยังตรวจจับตัวคั่นให้ด้วย ไม่ว่าจะเป็นจุลภาค อัฒภาค แท็บ หรือเส้นตั้ง

ไฟล์ถูกอ่านในเบราว์เซอร์ของคุณและไม่ถูกอัปโหลดไปไหน ซึ่งสำคัญสำหรับข้อมูลเงินเดือน ใบแจ้งหนี้ และรายการเดินบัญชี ถ้าจะแก้ไฟล์ให้โปรแกรมอื่นใช้ได้ ให้กดปุ่มส่งออก คุณจะได้สำเนาตารางแบบ UTF-8 ที่สะอาด (เป็นมุมมองปัจจุบัน ถ้าต้องการทุกแถว ให้ล้างคำค้นหาก่อน) โปรดทราบว่าโปรแกรมดู CSV ตรวจจับได้เฉพาะ UTF-8, Windows-1251 และ Windows-1252 ถ้าไฟล์ของคุณเป็น TIS-620 หรือ Windows-874 ให้แปลงเป็น UTF-8 ด้วยวิธีที่ 2 หรือ 3 ก่อน ถ้าปัญหาของคุณคือข้อมูลไปกองอยู่คอลัมน์เดียว ไม่ใช่ตัวอักษรเพี้ยน ดูทำไม CSV เปิดแล้วอยู่คอลัมน์เดียว

วิธีที่ 2: นำเข้าใน Excel โดยเลือก “File origin” ให้ถูก

อย่าดับเบิลคลิกไฟล์ ให้เปิดเวิร์กบุ๊กเปล่าแล้วใช้การนำเข้า “From Text/CSV” ในแท็บ Data หน้าต่างตัวอย่างจะมีรายการ File origin ให้เลือกการเข้ารหัส

สลับไปมาแล้วดูตัวอย่าง ทันทีที่ชื่อดูถูกต้อง แสดงว่าเลือกถูกแล้ว จากนั้นโหลดข้อมูล ถ้าต้องส่งไฟล์ต่อ ให้บันทึกจาก Excel ด้วยประเภทไฟล์ “CSV UTF-8” แทน “CSV” ธรรมดา ซึ่งอาจกลับไปใช้การเข้ารหัสแบบเก่าอีก

วิธีที่ 3: Google Sheets, LibreOffice หรือโปรแกรมแก้ไขข้อความ

Google Sheets การนำเข้า CSV ใน Google Sheets (File → Import) ทำงานได้ดีกับไฟล์ UTF-8 และหน้าต่างนำเข้าให้เลือกตัวคั่นได้ แต่ไม่ค่อยน่าพึ่งสำหรับไฟล์การเข้ารหัสแบบเก่า ถ้าไฟล์ Windows-1251, Windows-1252 หรือไฟล์ภาษาไทยแบบเก่ายังแสดงตัวอักษรเพี้ยน ให้แปลงเป็น UTF-8 ด้วยวิธีอื่นก่อน แล้วนำเข้าสำเนานั้น

LibreOffice Calc เมื่อเปิด CSV, LibreOffice จะแสดงหน้าต่างนำเข้าข้อความที่มีรายการ Character set เลือก Unicode (UTF-8), Cyrillic (Windows-1251), Western Europe (Windows-1252) หรือตัวเลือกภาษาไทย แล้วตัวอย่างจะอัปเดตทันที ใช้ได้ฟรีบน Windows, macOS และ Linux

โปรแกรมแก้ไขข้อความ โปรแกรมอย่าง Notepad บน Windows, TextEdit บน macOS หรือโปรแกรมเขียนโค้ดอย่าง VS Code ให้เลือกการเข้ารหัสตอนบันทึกได้ ข้อควรระวังคือโปรแกรมต้อง เปิด ไฟล์ด้วยการเข้ารหัสที่ถูกต้องก่อน ถ้าข้อความในโปรแกรมดูถูกต้อง ให้บันทึกเป็น UTF-8 แต่ถ้าในโปรแกรมก็ยังเพี้ยนอยู่ การบันทึกจะแค่เก็บตัวอักษรเพี้ยนไว้ ให้เปิดใหม่ด้วยการเข้ารหัสที่ถูกต้องก่อน

คำถามที่พบบ่อย

แก้ “????” ใน CSV ได้ไหม?

ส่วนใหญ่ไม่ได้ เครื่องหมายคำถามแปลว่าตัวอักษรถูกแทนที่ตั้งแต่ตอนเขียนไฟล์ ตัวอักษรต้นฉบับจึงไม่อยู่ในไฟล์แล้ว ให้ส่งออกใหม่จากโปรแกรมบัญชีหรือธนาคาร และเลือก UTF-8 ถ้าทำได้

ควรใช้การเข้ารหัสแบบไหนตอนบันทึกหรือส่งออก?

UTF-8 เก็บได้ทุกภาษา และโปรแกรมสมัยใหม่ทุกตัวเข้าใจ ถ้าเพื่อนร่วมงานเปิดไฟล์ด้วยการดับเบิลคลิกใน Excel ให้ใช้ตัวเลือก “CSV UTF-8” ของ Excel เพื่อให้ไฟล์ขึ้นต้นด้วย BOM

เปลี่ยนการเข้ารหัสแล้วตัวเลขจะเปลี่ยนไหม?

ไม่เปลี่ยน ตัวเลข จุด และจุลภาค เหมือนกันใน UTF-8, Windows-1251 และ Windows-1252 จำนวนเงินและวันที่จึงไม่ได้รับผลกระทบ มีแค่ตัวอักษรที่นอกเหนือจากภาษาอังกฤษพื้นฐานที่เปลี่ยน

แก้ไฟล์ที่ส่งออกจากธนาคารผ่านเว็บปลอดภัยไหม?

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