ค่า Sentinel Unicode ที่ฉันสามารถใช้ได้


14

ฉัน desiging รูปแบบไฟล์และต้องการทำถูกต้อง เนื่องจากเป็นรูปแบบไบนารีดังนั้นไบต์แรก (หรือไบต์) ของไฟล์จึงไม่ควรมีรูปแบบข้อความที่ถูกต้อง (เช่นเดียวกับในส่วนหัวของไฟล์ PNG 1 ) วิธีนี้ช่วยให้เครื่องมือที่ไม่รู้จักรูปแบบยังคงเห็นว่าไม่ใช่ไฟล์ข้อความโดยดูที่สองสามไบต์แรก

codepoint ด้านบนใด ๆ0x7Fนั้นไม่ถูกต้อง US-ASCII ดังนั้นจึงเป็นเรื่องง่าย แต่สำหรับ Unicode มันเป็นเรื่องที่แตกต่างกันโดยสิ้นเชิง นอกเหนือจากตัวอักษร Unicode ที่ถูกต้องมีตัวอักษรส่วนตัวการใช้งาน , noncharactersและยามรักษาการณ์ที่ผมพบในUnicode เอกชนใช้ตัวอักษร, Noncharacters และยามรักษาการณ์คำถามที่พบบ่อย

อะไรคือลำดับของ Sentinel ของไบต์ที่ฉันสามารถใช้เมื่อเริ่มต้นไฟล์ซึ่งจะทำให้ US-ASCII, UTF-8, UTF-16LE และ UTF-16BE ที่ไม่ถูกต้อง

  • เห็นได้ชัดว่าไบต์แรกไม่สามารถมีค่าด้านล่างได้0x80เนื่องจากจะเป็นอักขระ US-ASCII (ตัวควบคุม) ที่ถูกต้องดังนั้นจึง0x00ไม่สามารถใช้งานได้
  • นอกจากนี้เนื่องจากอักขระที่ใช้งานส่วนตัวเป็นอักขระ Unicode ที่ถูกต้องฉันจึงไม่สามารถใช้ codepoints เหล่านั้นได้เช่นกัน
  • เนื่องจากมันจะต้องทำงานกับทั้ง UTF-16 และend -little-endian, noncharacterเช่น0xFFFEนั้นเป็นไปไม่ได้เนื่องจาก reverse ของมัน0xFEFFเป็นอักขระ Unicode ที่ถูกต้อง
  • คำถามที่พบบ่อยที่กล่าวถึงข้างต้นไม่แนะนำให้ใช้อักขระที่ไม่ใช่ตัวอักษรใด ๆเนื่องจากจะยังคงมีลำดับ Unicode ที่ถูกต้องดังนั้นสิ่งที่คล้ายกัน0xFFFFนี้ก็ไม่อยู่ในภาพ

สิ่งที่จะเป็นค่ารักษาการณ์ในอนาคตที่ฉันจะใช้?


1 ) รูปแบบ PNG ได้เป็นไบต์แรกมากของมันไม่ใช่ ASCII ค่าตามด้วยสตริง0x89 PNGเครื่องมือที่อ่านไม่กี่ไบต์แรกของ PNG อาจพิจารณาว่าเป็นไฟล์ไบนารีเนื่องจากไม่สามารถตีความ0x89ได้ ในทางกลับกันไฟล์ GIF จะเริ่มต้นโดยตรงด้วยสตริง ASCII ที่ถูกต้องและอ่านได้GIFแล้วตามด้วยอักขระ ASCII ที่ถูกต้องอีกสามตัว สำหรับ GIF เครื่องมืออาจพิจารณาว่าเป็นไฟล์ข้อความที่สามารถอ่านได้ นี่เป็นสิ่งที่ผิดและแนวคิดในการเริ่มต้นไฟล์ด้วยลำดับไบต์ที่ไม่ใช่เนื้อสัมผัสมาจากการออกแบบรูปแบบไฟล์โดย Andy McFadden


3
Since it is a binary format, the first bytes of the file should not form valid textual characters- คุณควรดูไฟล์มายากล (/ usr / share / magic หรือ / etc / magic บนระบบยูนิกซ์หลายระบบ) ที่แสดงว่าแอปพลิเคชันนี้ระบุประเภทไฟล์อย่างไร ไฟล์ PNG เริ่มต้นด้วย\x89PNG\x0d\0a\x1a\x0a- สังเกต "PNG" ในนั้นนั่นคือสตริงดิบ ลำดับ\x89และสิ่งที่คล้ายกันคือไบต์ที่ไม่สามารถพิมพ์ได้

@MichaelT ใช่เนื่องจาก PNG เป็นรูปแบบไบนารี่ไบต์แรกจึงไม่ได้เป็นตัวอักษรที่ถูกต้อง นั่นคือสิ่งที่ฉันหมายถึง. ฉันไม่เห็นประเด็นของคุณ?
Daniel AA Pelsmaeker

7
นั่นคือตัวอย่าง .gif GIF8เริ่มต้นด้วย ไฟล์ SGI Movi MOVIเริ่มต้นด้วย หนึ่งรูปแบบของไฟล์ไฟล์ zip ที่เริ่มต้นด้วยZZรูปแบบที่นิยมมากขึ้น PKZIP PKเริ่มต้นด้วย ข้อ จำกัด ที่ไบต์แรกเป็นอักขระข้อความที่ไม่ถูกต้องดูเหมือนจะไม่ตรงกับสิ่งที่พบใน wild ฉันอยากรู้ว่าทำไมนี่เป็นข้อกำหนด

3
คุณสนใจวิธีการทำงานของโปรแกรมอื่น ๆ เมื่อพวกเขาเห็นไฟล์ที่ไม่รู้จักหรือไม่? สำหรับฉันลำดับลายเซ็น (เช่นไฟล์ PNG) มีประโยชน์มากกว่าลำดับ Sentinel - เมื่อเนื้อหาถูกส่งผ่านโปรโตคอลการสตรีมอย่างง่ายผู้รับสามารถตัดสินใจได้ทันทีว่าจะจัดการกับไบต์ต่อไปนี้อย่างไร ลำดับ Omani-Sentinel อยู่ถัดจากไม่มีลำดับเมื่อทุกคนเริ่มใช้มันเพื่อระบุรูปแบบของตนเอง
Codism

2
@ Virtlink ฉันไม่สนใจว่าคุณจะใช้ไบต์ใดในรูปแบบไฟล์ของคุณ แต่คุณยืนยันว่ามัน 'ผิด' ที่จะใช้ตัวอักษร ascii ... แต่ฉันไม่เห็นอะไรที่นี่ที่สนับสนุนการเรียกร้องนั้นและมีประสบการณ์เชิงประจักษ์มากมายที่แสดงให้เห็นว่ามันไม่สำคัญ (เช่นไฟล์ที่นับไม่ถ้วน รูปแบบที่ใช้อักขระ ASCII โดยไม่มีปัญหามานานหลายสิบปี)
GrandmasterB

คำตอบ:


16

0xDC 0xDC

  • UTF-8 และ ASCII ไม่ถูกต้องอย่างชัดเจน
  • เส้นทางตัวแทนที่ไม่มีคู่ในตำแหน่งนำโดยไม่คำนึงถึง endianess ใน UTF-16 ไม่ได้รับ UTF-16 ที่ไม่ถูกต้องมากกว่านี้

แต่ ISO-8859-1 สมเหตุสมผลอย่างสมบูรณ์และอาจสมเหตุสมผลในชุดอักขระอื่น ๆ ที่ใช้การเข้ารหัส 8 บิต
parsifal

4
+1 OP ไม่ได้ขอ ISO 8859-1 เพียง US-ASCII และ UTF- *
Ross Patterson

@RossPatterson - จริง แต่ฉันสงสัยว่าส่วนใหญ่เป็นเพราะ OP ไม่ได้คิดผ่านปัญหาจริงๆ หากไม่มีสถิติใด ๆ ในการสำรองข้อมูลฉันยินดีที่จะเดิมพันว่าอัลกอริทึมแบบ "เป็นข้อความนี้" แบบสุ่มมีแนวโน้มที่จะให้ความพึงพอใจต่อ ISO-8859-1 มากกว่า UTF-16 เพียงเพราะมีจำนวนมหาศาล 8 บิต ข้อความในโลก
parsifal

3
@parsifal ไบนารีใด ๆ นั้นถูกต้องตามมาตรฐาน ISO-8859-1 ดังนั้นจึงไม่จำเป็นต้องนำมาพิจารณาเนื่องจากเป็นไปไม่ได้ที่จะทำให้ ISO-8859-1 ไม่ถูกต้อง
Esailija

1
@parsifal จริงและถ้านั่นเป็นข้อกำหนดที่คุณสามารถใช้0x00หรืออะไรก็ตาม แต่ op ไม่ต้องการมัน
Esailija

5
  • ใน UTF-8 ไบต์ C0, C1 และ F5 - FF นั้นผิดกฎหมาย ไบต์แรกต้องเป็น ASCII หรือไบต์ในช่วง C2-F4 ไบต์เริ่มต้นอื่นใดไม่ถูกต้อง UTF-8

  • ใน UTF-16 โดยปกติไฟล์จะเริ่มต้นด้วย Byte Order Mark (U + FEFF) มิฉะนั้นแอปพลิเคชั่นต้องเดาตามลำดับไบต์ Codepoints ในช่วง D800-DBFF เป็นตะกั่วไบต์สำหรับคู่ตัวแทนและ DC00-DFFF เป็นไบต์ต่อท้ายสำหรับคู่ตัวแทน

F5DCดังนั้นฉันต้องการใช้คำสั่งผสมไบต์ ค่าทั้งสองนี้คือ:

  • ไม่ใช่ ASCII
  • ไม่ถูกต้อง UTF-8
  • ไม่ว่าจะตีความว่าเป็นต่อท้ายไบต์ UTF-16 ในคู่ตัวแทน (ไม่ได้ตามกฎหมาย) หรือจุดโค้ดยู + F5DC ซึ่งเป็นตัวละครที่ใช้ส่วนตัว แต่เพียงโดยการใช้งานที่ตะแบงพยายามที่จะแปลความหมายนี้เป็น UTF-16 ได้โดยไม่ต้อง BOM .

หากคุณต้องการตัวเลือกเพิ่มเติมผู้F5DDใช้F5DFทั้งหมดจะมีคุณสมบัติ 3 อย่างเช่นเดียวกับF6DC- F6DF, F7DC- F7DFและF8DC- F8DFสำหรับคอมโบไบต์ที่ต่างกันทั้งหมด 16 แบบให้เลือก


ดังนั้นตามคำแนะนำของ Esailija ในการใช้ U + DCDC 0xDCจะเป็น UTF-8 ที่ถูกต้องหรือไม่
Daniel AA Pelsmaeker

2
@Virtlink 0xDCเป็นไบต์นำ UTF-8 สำหรับลำดับ 2 ไบต์ จะต้องตามด้วย10xxxxxxไบต์ต่อเนื่องเพื่อให้ถูกต้อง 0xDCไม่ใช่ไบต์การต่อเนื่องที่ถูกต้องดังนั้นจึง0xDC 0xDCไม่ถูกต้อง UTF-8
Esailija

@Virtlink: ไม่มีเพราะไบต์ที่สองคือไม่ถูกต้องก็จะต้องอยู่ในช่วง-80 BF
Martijn Pieters

2

หากคุณพยายามใช้ตัวอักษรที่พิมพ์ไม่ได้เพื่อระบุว่า "ไม่ใช่ข้อความ" คุณจะพบว่ามันยากที่จะเอาชนะ 0x89:

  • อยู่นอกช่วง US-ASCII
  • ใน ISO-8859-1 เป็นอักขระที่ไม่สามารถพิมพ์ได้ ("ตารางอักขระที่มีการปรับแต่ง") เช่นเดียวกันกับ Shift-JIS ซึ่งฉันเชื่อว่ายังใช้งานได้ทั่วไป การเข้ารหัส 8 บิตอื่นอาจอย่างไรก็ตามถือว่าเป็นอักขระที่ถูกต้อง
  • ใน UTF-8 เป็นไบต์แรกที่ไม่ถูกต้องสำหรับลำดับหลายไบต์ (บิตบนสุดคือ 10 ซึ่งสงวนไว้สำหรับอักขระ 2.N ของลำดับหลายไบต์)

โดยทั่วไปเมื่อคุณสร้างตัวเลขเวทย์มนตร์ "ไม่ใช่ข้อความ" เป็นจุดย่อย ฉันจะต้องค้นหาข้อมูลอ้างอิง แต่หนึ่งในรูปแบบกราฟิกมาตรฐาน (TIFF ฉันคิดว่า) มีบางอย่างที่แตกต่างกันหกข้อมูลที่เป็นประโยชน์จากหมายเลขมายากล

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.