ไทย

ข้อมูลและสเปรดชีต · CSV สะอาดยิ่งขึ้น

UTF-8 และ Windows-1252 เกิดความสับสนอย่างไร: การซ่อมแซม Mojibake CSV ส่งออก

· มันทำงานอย่างไร

csv การเข้ารหัส การทำความสะอาดข้อมูล

ไบต์ที่เข้ารหัสแบบเดิมถึงขอบเขต UTF-8 เท่านั้นและสร้างเครื่องหมายแทนที่
ภาพประกอบเวกเตอร์ต้นฉบับ ToolAcre

เมื่อ 'José' กลายเป็น 'José' ไบต์ก็ใช้ได้และการตีความก็ผิด โพสต์นี้จะอธิบายว่าการเข้ารหัสที่พบบ่อยที่สุดสองตัวขัดแย้งกันอย่างไร วิธีรับรู้ถึงอาการ และวิธีที่การถอดรหัสซ้ำจะซ่อมแซมได้อย่างไร

ชื่อที่เน้นเสียงและเครื่องหมายคำพูดแบบโค้งกลายเป็นซุปสัญลักษณ์ — รูปแบบการเล่าเรื่องของไฟล์ UTF-8 อ่านเป็น Windows-1252 และในทางกลับกัน

ชื่อลูกค้าที่กลายเป็นเพชรทดแทนหลังจากโหลดไม่ใช่หลักฐานว่า CSV Cleaner ตรวจพบรหัสเพจเดิมที่ไม่ถูกต้อง การกำหนดค่าบอกว่าตรงกันข้าม: เข้าใจเฉพาะ UTF-8 เท่านั้น และไฟล์ Windows-1252 หรือ Shift-JIS จะถูกอ่านเป็น UTF-8 ลำดับไบต์ที่ไม่ถูกต้องจึงสามารถถูกแทนที่ได้แล้วก่อนที่พาร์เซอร์ CSV จะเห็นอักขระ

เค้าร่างมีศูนย์กลางอยู่ที่ mojibake ที่คุ้นเคย เช่น José แต่เส้นทางการอ่านของเบราว์เซอร์ใช้ `File.text()` และไม่มีตัวเลือกการเข้ารหัส บทความนี้แก้ไขคำสัญญานั้น อาการที่ดำเนินการได้ภายในเครื่องมือนี้คือการแทนที่อักขระหรือข้อความที่เสียหาย โดยที่ไบต์ของไฟล์ต้นฉบับจะถูกสงวนไว้สำหรับการกู้คืนที่อื่น

ไฟล์ที่ไม่ใช่ UTF-8 มาถึงเครื่องมือนี้ในรูปแบบอักขระแทนที่ ไม่ใช่รูปแบบโมจิเบคที่ได้รับการยืนยัน

ไฟล์ที่ใช้ตัวคั่นจะมีหน่วยเป็นไบต์บนดิสก์ ในขณะที่ parser ทำงานบนสตริง JavaScript การเข้ารหัสกำหนดการแมประหว่างเลเยอร์เหล่านั้น CSV ไวยากรณ์ตั้งชื่อลูกน้ำ เครื่องหมายคำพูด และขอบเขตการบันทึก แต่ไม่มีการประกาศบนดิสก์ที่เชื่อถือได้ โดยบอก `File.text()` ว่าการแมปแบบเดิมใดที่สร้างทุกไบต์ที่ไม่ใช่ ASCII

เมื่อการถอดรหัสสร้างอักขระแทนที่ U+FFFD แล้ว การดำเนินการ CSV ในภายหลังจะได้รับตัวยึดตำแหน่งเหล่านั้นเป็นข้อความธรรมดา การตัดหรือส่งออกไม่สามารถสรุปได้ว่าลำดับไบต์หรืออักขระต้นฉบับใดอยู่ในนั้น นั่นคือเหตุผลว่าทำไมแหล่งที่มาที่ไม่ถูกแตะต้องจึงมีความสำคัญมากกว่ารายการค้นหาและแทนที่ที่ประกอบขึ้นจากจอแสดงผลที่เสียหาย

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

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

ลักษณะการทำงานของพาร์เซอร์เฉพาะการเข้ารหัสเพียงอย่างเดียวคือการลบเครื่องหมายลำดับไบต์ U+FEFF UTF-8 นำหน้าหลังจากการถอดรหัสข้อความ เพื่อป้องกันไม่ให้เครื่องหมายเข้าร่วมส่วนหัวแรก ไม่ใช่การตรวจจับการเข้ารหัสทั่วไป และไม่มีการรองรับ Shift-JIS, UTF-16 หรือโค้ดเพจภูมิภาคที่ไม่มีกล่าวถึงในการใช้งาน

ToolAcre ยอมรับข้อความ UTF-8 และไม่เปรียบเทียบตัวเลือก Windows-1252

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

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

ถอดรหัสซ้ำ ไม่ใช่ค้นหาและแทนที่ - เหตุใดการแก้ไขคือการอ่านไบต์ด้วยการเข้ารหัสที่ถูกต้องและเขียน UTF-8 แทนที่จะแพตช์อักขระทีละตัว

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

CSV Cleaner ไม่มีการควบคุมการถอดรหัสซ้ำในระดับไบต์ ดังนั้นจึงไม่สามารถดำเนินการแปลงตามสัญญาของเค้าร่างได้ ใช้วิธีการแปลงที่ทราบแหล่งที่มาที่เชื่อถือได้ เปรียบเทียบชื่อตัวแทนกับระบบต้นทาง จากนั้นนำผลลัพธ์ UTF-8 มาไว้ที่นี่เพื่อเป็นตัวคั่น การอ้างอิง ช่องว่าง และงานที่ซ้ำกัน

กู้คืนจากไบต์ต้นฉบับที่อยู่นอกเครื่องมือนี้ การแทนที่อักขระที่นี่ไม่สามารถกู้คืนได้

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

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

ตัวอย่างการทำงาน: สาธิตขอบเขต UTF-8 โดยไม่ต้องอ้างสิทธิ์การซ่อมแซมที่ไม่รองรับ

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

นอกจากนี้ยังหลีกเลี่ยงการอ้างสิทธิ์การสนับสนุน UTF-16 การเข้ารหัสแบบเอเชียตะวันออกหรือแบบฟอร์มการทำให้เป็นมาตรฐาน หากมีความสำคัญ ให้เลือกตัวแปลงที่ตั้งชื่อและทดสอบ การแยกวิเคราะห์ CSV ที่ประสบความสำเร็จจะพิสูจน์เฉพาะแถวที่เครื่องระบุสถานะตัวคั่นพบเท่านั้น มันไม่ได้บอกว่าการถอดรหัสอักขระก่อนขั้นตอนนั้นจะซื่อสัตย์หรือไม่

แก้ไขการตีความหนึ่งครั้ง - วิธีที่การซ่อมแซมการเข้ารหัสของ ToolAcre CSV Cleaner ถอดรหัสใหม่และเข้ารหัสการส่งออกบนอุปกรณ์ของคุณอีกครั้ง

ToolAcre สามารถตัด UTF-8 BOM นำหน้า และซีเรียลไลซ์สตริงผลลัพธ์เป็น UTF-8 CSV ผ่านเส้นทางการดาวน์โหลดของเบราว์เซอร์ ไม่สามารถเปลี่ยนไบต์ดั้งเดิมตามอำเภอใจให้เป็น Unicode ที่ถูกต้องได้ เนื่องจากไบต์เหล่านั้นได้ข้ามขอบเขตการอ่านข้อความคงที่ของเบราว์เซอร์แล้วโดยไม่มีตัวถอดรหัสที่ผู้ใช้เลือก

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