เครื่องมือสำหรับนักพัฒนา · การเปรียบเทียบข้อความ
ความแตกต่างที่มองไม่เห็น: การเว้นวรรคแบบไม่แยก เครื่องหมายคำพูดอัจฉริยะ และแบบฟอร์ม Unicode
· มันทำงานอย่างไร
ข้อความที่แตกต่าง ยูนิโค้ด การดีบัก
อธิบายว่าทำไมบรรทัดที่มีลักษณะเหมือนกันบนหน้าจออาจแตกต่างกันไบต์ต่อไบต์ ตั้งแต่ช่องว่างที่ไม่แยกและเครื่องหมายคำพูดแบบโค้งไปจนถึงอักขระที่มีความกว้างเป็นศูนย์และสำเนียงที่แยกส่วน และวิธีการค้นหา
สองบรรทัดที่ดูเหมือนกันแต่ถูกทำเครื่องหมายว่ามีการเปลี่ยนแปลง เปิดขึ้นพร้อมกับไฟล์การแปลที่ไม่ผ่านการตรวจสอบโดยไม่ทราบสาเหตุ
บรรทัดการแปลสามารถแสดงผลได้เหมือนกับเพื่อนบ้านแต่ยังคงล้มเหลวในการเปรียบเทียบ แบบอักษรของเบราว์เซอร์ซ่อนขอบเขตจุดโค้ด รวมสำเนียง และกำหนดรูปร่างที่คล้ายกันให้กับเครื่องหมายวรรคตอนต่างๆ ToolAcre เปรียบเทียบ JavaScript สตริงหลังจากเฉพาะกรณีที่เลือกหรือการแปลงช่องว่าง ดังนั้นแถวที่ถูกตั้งค่าสถานะสามารถเปิดเผยความแตกต่างทางข้อความที่แท้จริง
เชื่อถือสถานที่ ไม่ใช่การสันนิษฐานเกี่ยวกับตัวละคร คัดลอกบรรทัดที่ต้องสงสัยลงในโปรแกรมแก้ไขที่แสดงจุดโค้ดหรือตัวตรวจสอบเลขฐานสิบหก ส่วนต่างจะบอกคุณว่าบรรทัดใดแตกต่าง มันไม่ได้ใส่คำอธิบายประกอบตำแหน่งภายในหรือตั้งชื่อค่า Unicode ที่รับผิดชอบ
ช่องว่างที่ไม่แยกและความสัมพันธ์ — อธิบาย U+00A0 และอักขระช่องว่างอื่นๆ ที่โปรแกรมประมวลผลคำแทรก และเหตุใดช่องว่างจึงไม่ตรงกัน
U+00A0 ช่องว่างไม่แยกไม่เหมือนกับอักขระเดียวกับช่องว่างธรรมดา U+0020 ในโหมดปกติ ปุ่มสายจะยังคงแตกต่างออกไป ภายใต้ละเว้นช่องว่าง การแทนที่การเรียกใช้ช่องว่างอาจลดการทำงานเหล่านั้นให้เหลือพื้นที่ปกติหลังจากการตัดแต่ง ทำให้ความแตกต่างบางอย่างหายไป
ตัวเลือกนั้นเป็นการแปลงที่ตรงกัน ไม่ใช่คำสั่งการล้างข้อมูล Unicode แถวที่เท่ากันที่แสดงจะคงข้อความต้นฉบับด้านซ้าย และไม่มีการสร้างเอกสารที่แก้ไข หากระบบการเผยแพร่ต้องการการเว้นวรรคแบบไม่แยก การจับคู่แบบมาตรฐานอาจซ่อนคำสั่งเค้าโครงที่ตั้งใจไว้แทนที่จะแก้ไข
โหมดช่องว่างอาจยุบช่องว่าง Unicode; การเปรียบเทียบแบบธรรมดาจะรักษาอักขระที่แตกต่างไว้
เครื่องหมายอะพอสทรอฟีและเครื่องหมายคำพูดตรงแตกต่างจากแบบฟอร์มเปิดและปิดตัวพิมพ์ ละเว้นตัวพิมพ์จะไม่เปลี่ยนเครื่องหมายวรรคตอน และการจัดการช่องว่างจะไม่เขียนเครื่องหมายคำพูดใหม่ การแก้ไขอัตโนมัติของโปรแกรมประมวลผลคำจึงสามารถแทนที่บรรทัดเต็มได้แม้ว่าประโยคจะอ่านเหมือนกันในทันทีก็ตาม
เลือกเครื่องหมายวรรคตอนที่ต้องการตามจุดหมายปลายทาง ซอร์สโค้ด ปุ่มค้นหา และรูปแบบข้อมูลอาจต้องใช้อักขระ ASCII ทุกประการ ในขณะที่สำเนาบรรณาธิการอาจต้องการรูปแบบการพิมพ์ การเปรียบเทียบพิสูจน์ความแตกต่าง แต่ไม่มีนโยบายในการตัดสินว่าฝ่ายใดถูกต้อง
อักขระที่มีความกว้างเป็นศูนย์และระบุทิศทาง — ครอบคลุมช่องว่างที่มีความกว้างเป็นศูนย์ ตัวเชื่อม และเครื่องหมายสองทิศทางที่แสดงว่ายังไม่มีการเปลี่ยนแปลงบรรทัด
ช่องว่างที่มีความกว้างเป็นศูนย์ ตัวเชื่อม และเครื่องหมายทิศทางสามารถครอบครองตำแหน่งสตริงได้โดยไม่ต้องวาดสัญลักษณ์ที่มองเห็นได้ ToolAcre แสดงผลอินพุตโดยใช้เนื้อหาข้อความ หลีกเลี่ยงการตีความ HTML แต่การเรนเดอร์ที่ปลอดภัยนั้นไม่ได้ทำให้มองเห็นจุดโค้ดที่ซ่อนอยู่ พวกเขายังคงมีส่วนร่วมในความเท่าเทียมกันของสายสามัญ
พฤติกรรมทิศทางยังสามารถทำให้ลำดับภาพเป็นแนวทางที่ไม่น่าเชื่อถือในลำดับการจัดเก็บ อย่าคัดลอกส่วนที่มีทิศทางผสมที่น่าสงสัยลงในคำสั่งเชลล์หรือตัวระบุเพียงเพราะมันดูคุ้นเคย ตรวจสอบจุดรหัสและบริบทโดยรอบในเครื่องมือที่สร้างขึ้นโดยเฉพาะก่อนที่จะแทนที่สิ่งใดๆ
สำเนียงที่เรียบเรียงและแยกย่อย - อธิบาย NFC กับ NFD การทำให้เป็นมาตรฐานด้วยตัวอักษรเน้นเสียงเป็นจุดรหัสเดียวเทียบกับตัวอักษรฐานบวกเครื่องหมายรวม
อักขระที่มีการเน้นเสียงอาจแสดงเป็นจุดรหัสที่เขียนไว้ล่วงหน้าหนึ่งจุดหรือเป็นตัวอักษรฐานตามด้วยเครื่องหมายรวม พื้นที่เก็บข้อมูลไม่มีการเรียก `normalize` ดังนั้นรูปแบบที่เทียบเท่าตามหลักบัญญัติจึงยังคงเป็นสตริง JavaScript ที่แตกต่างกัน และสามารถสร้างแถวลบบวกเพิ่มได้
ชุดทดสอบพิสูจน์ว่าสตริง Unicode ที่เหมือนกันตรงกัน และ `café` แตกต่างจาก `cafe`; มันไม่ได้รับประกันการเปรียบเทียบที่รับรู้ถึงกราฟ บทความนี้จึงหลีกเลี่ยงการอ้างสิทธิ์เกี่ยวกับการเปรียบเทียบไบต์หรือการเทียบเท่า Unicode แบบเต็ม อัลกอริธึมบรรทัดรับสตริงและเปรียบเทียบคีย์ที่แปลงแล้วด้วยความเท่าเทียมกันที่เข้มงวด
สำเนียงที่เรียบเรียงและแยกส่วนยังคงแตกต่างกันเนื่องจากเครื่องมือไม่ดำเนินการปรับมาตรฐาน Unicode
สมมติว่ารายการทรัพยากรปรากฏไม่เปลี่ยนแปลงแต่ถูกตั้งค่าสถานะ ขั้นแรกให้เปรียบเทียบโดยปิดตัวเลือกทั้งหมด จากนั้นสลับช่องว่างเพียงอย่างเดียว หากแถวเท่ากัน ให้ตรวจสอบช่องว่างและช่องว่างที่ซ่อนอยู่ หากยังคงมีการเปลี่ยนแปลง ให้ตรวจสอบเครื่องหมายคำพูด การรวมเครื่องหมาย และจุดโค้ดอื่นๆ แทนที่จะพิมพ์บรรทัดซ้ำๆ
ผู้ตรวจสอบตัวละครสามารถเปิดเผย U+00A0 ในตำแหน่งที่คาดว่าจะมีช่องว่างปกติได้ แทนที่หลังจากยืนยันข้อกำหนดของรูปแบบแล้วเท่านั้น ในเนื้อหาที่แปล การเว้นวรรคแบบไม่แยกอาจเป็นรูปแบบการใช้เครื่องหมายวรรคตอนโดยเจตนา และการค้นหาและแทนที่แบบกว้างๆ อาจสร้างความเสียหายให้กับการพิมพ์ที่ถูกต้องในที่อื่นได้
สิ่งนี้ไม่ครอบคลุม — รายงานการเปรียบเทียบที่มีบรรทัดแตกต่างกัน มันไม่ได้ทำการทำให้เป็นมาตรฐาน Unicode สำหรับคุณหรือแทนที่อักขระ
ข้อความต่างไม่ทำให้ NFC หรือ NFD เป็นมาตรฐาน ระบุสิ่งที่สับสน ลบเครื่องหมายความกว้างเป็นศูนย์ หรือสร้างเอาต์พุตที่ซ่อมแซมแล้ว นอกจากนี้ยังไม่เปรียบเทียบไบต์ที่เข้ารหัสด้วย สิ่งเหล่านี้เป็นการดำเนินการที่แยกจากกันซึ่งมีผลกระทบที่ตัวเปรียบเทียบบรรทัดทั่วไปไม่ควรเลือกโดยไม่ตั้งใจ
ละเว้นตัวพิมพ์ใช้ JavaScript `toLowerCase` ในขณะที่ละเว้นการตัดแต่งช่องว่างและย่อคีย์ที่ตรงกัน การดำเนินการทั้งสองไม่ได้จัดเตรียมการจัดเรียงแบบ Locale-Aware หรือการตรวจสอบความปลอดภัยของ Unicode ใช้ผลลัพธ์เพื่อจำกัดขอบเขตการตรวจสอบ ไม่ใช่เพื่อรับรองตัวระบุว่าปลอดภัยหรือเทียบเท่าทางภาษา
ประเด็นสำคัญ: เชื่อถือความแตกต่างในสายตาของคุณ — สรุปว่าบรรทัดที่ถูกตั้งค่าสถานะคือความแตกต่างที่แท้จริง และแสดงให้เห็นว่าการเปรียบเทียบข้อความของ ToolAcre ระบุว่าบรรทัดใดที่ต้องตรวจสอบ
เมื่อสายตาและความแตกต่างไม่เห็นด้วย ให้ถือว่าเชือกนั้นสมควรได้รับการตรวจสอบ อัลกอริธึมไม่มีแบบจำลองภาพที่จะหลอกโดยการสร้างแบบอักษร มันเห็นปุ่มบรรทัด ข้อจำกัดดังกล่าวมีประโยชน์เนื่องจากจะป้องกันไม่ให้ส่งผ่านความแตกต่างที่ซ่อนอยู่เพียงเพราะเบราว์เซอร์ดึงความแตกต่างเหล่านั้นมาเหมือนกัน
เรียกใช้การเปรียบเทียบแบบธรรมดาก่อน บันทึกว่าตัวเลือกใดเปลี่ยนแปลงผลลัพธ์ และตรวจสอบจุดโค้ดก่อนทำการแก้ไข เส้นทางหลักฐานนี้แยกการทำให้ช่องว่างเป็นมาตรฐานจากเครื่องหมายวรรคตอนหรือองค์ประกอบ และหลีกเลี่ยงนิสัยการทำลายล้างด้วยการแทนที่อักขระที่ผิดปกติทุกตัวด้วยการประมาณ ASCII