UTF-8เป็นวิธีที่ง่ายในการเข้ารหัส Unicode codepoints ในรูปแบบความกว้างของตัวแปรซึ่งจะไม่ทำให้เกิดความสับสนกับโค้ดที่ไม่รู้ Unicode
ภาพรวม UTF-8
- ไบต์ในช่วง 1-0x7F โดยรวมจะถูกต้องตามปกติ
- ไบต์ที่มีรูปแบบบิต
10XX XXXXถือว่าเป็นไบต์ต่อเนื่องโดยใช้บิตที่มีนัยสำคัญน้อยที่สุดหกบิตที่ใช้ในการเข้ารหัสส่วนของ codepoint สิ่งเหล่านี้จะต้องไม่ปรากฏขึ้นเว้นแต่จะได้รับการคาดหวังจากไบต์ก่อนหน้า - ไบต์ที่มีรูปแบบ
110X XXXXคาดว่าหนึ่งไบต์ต่อเนื่องหลังจากนั้น - ไบต์ที่มีรูปแบบ
1110 XXXXคาดว่าจะมีความต่อเนื่องสองไบต์หลังจากนั้น - ไบต์ที่มีรูปแบบ
1111 0XXXคาดว่าสามไบต์ต่อเนื่องหลังจากนั้น - ไบต์อื่นทั้งหมดไม่ถูกต้องและไม่ควรปรากฏที่ใดก็ได้ในสตรีม UTF-8 5, 6 และ 7 ไบต์เป็นไปได้ในทางทฤษฎี แต่จะไม่ได้รับอนุญาตสำหรับจุดประสงค์ของการท้าทายนี้
การเข้ารหัสที่ยาวนานเกินไป
UTF-8 ยังต้องการให้ codepoint ควรแสดงด้วยจำนวนไบต์ต่ำสุด ลำดับไบต์ใด ๆ ที่สามารถแทนด้วยจำนวนไบต์ที่น้อยกว่านั้นไม่ถูกต้อง แก้ไข UTF-8 เพิ่มข้อยกเว้นหนึ่งข้อสำหรับอักขระ null (U + 0000) ซึ่งควรแสดงเป็นC0 80(การแสดงฐานสิบหก) และแทนที่จะปิดการใช้งาน null null เพื่อปรากฏที่ใดก็ได้ในสตรีม (สิ่งนี้ทำให้เข้ากันได้กับสตริงที่สิ้นสุดด้วยค่า null)
ท้าทาย
คุณต้องสร้างโปรแกรมที่เมื่อได้รับสตริงของไบต์จะพิจารณาว่าสตริงนั้นหมายถึง Modified UTF-8 ที่ถูกต้องหรือไม่และจะส่งกลับค่าความจริงหากถูกต้องและเป็นค่าเท็จ โปรดทราบว่าคุณต้องตรวจสอบการเข้ารหัสที่มากเกินไปและไบต์ว่าง (เนื่องจากนี่คือ Modified UTF-8) คุณไม่จำเป็นต้องถอดรหัสค่า UTF-8
ตัวอย่าง
41 42 43 ==> yes (all bytes are in the 0-0x7F range)
00 01 02 ==> no (there is a null byte in the stream)
80 7F 41 ==> no (there is a continuation byte without a starter byte)
D9 84 10 ==> yes (the correct number of continuation bytes follow a starter byte)
F0 81 82 41 ==> no (there are not enough continuation bytes after F0)
EF 8A A7 91 ==> no (too many continuation bytes)
E1 E1 01 ==> no (starter byte where a continuation byte is expected)
E0 80 87 ==> no (overlong encoding)
41 C0 80 ==> yes (null byte encoded with the only legal overlong encoding)
F8 42 43 ==> no (invalid byte 'F8')
กฎระเบียบ
- ใช้กฎมาตรฐานและช่องโหว่
- อินพุตและเอาต์พุตสามารถอยู่ในรูปแบบที่สะดวกใด ๆ ตราบใดที่ค่าทั้งหมดในช่วงไบต์ที่ไม่ได้ลงนาม (0-255) สามารถอ่านได้
- คุณอาจต้องใช้อาร์เรย์หรือไฟล์แทนสตริงที่สิ้นสุดด้วยค่า null คุณต้องสามารถอ่านค่า null ได้
- รหัสที่สั้นที่สุดชนะ!
- โปรดทราบว่าการใช้ builtins เพื่อถอดรหัส UTF-8 ไม่รับประกันว่าจะเป็นไปตามข้อกำหนดที่ให้ไว้ที่นี่ คุณอาจต้องแก้ไขมันและสร้างกรณีพิเศษ
แก้ไข: เพิ่มโบนัสสำหรับการไม่ใช้ builtins ที่ถอดรหัส UTF-8
EDIT2: นำโบนัสออกเนื่องจากมีเพียงคำตอบสนิมเท่านั้นที่ผ่านการรับรองและมันค่อนข้างจะยากที่จะกำหนด