ถ้า UTF-8 เป็น 8 บิตไม่ได้หมายความว่าจะมีอักขระที่แตกต่างกันได้สูงสุด 256 ตัวหรือไม่?
จุดรหัส 128 รายการแรกเหมือนกับใน ASCII แต่มันบอกว่า UTF-8 สามารถรองรับได้ถึงล้านตัวอักษร?
วิธีนี้ทำงานอย่างไร?
ถ้า UTF-8 เป็น 8 บิตไม่ได้หมายความว่าจะมีอักขระที่แตกต่างกันได้สูงสุด 256 ตัวหรือไม่?
จุดรหัส 128 รายการแรกเหมือนกับใน ASCII แต่มันบอกว่า UTF-8 สามารถรองรับได้ถึงล้านตัวอักษร?
วิธีนี้ทำงานอย่างไร?
คำตอบ:
UTF-8 ไม่ได้ใช้หนึ่งไบต์ตลอดเวลาคือ 1 ถึง 4 ไบต์
อักขระ 128 ตัวแรก (US-ASCII) ต้องมีหนึ่งไบต์
อักขระ 1,920 ตัวถัดไปต้องใช้สองไบต์ในการเข้ารหัส ซึ่งครอบคลุมส่วนที่เหลือของตัวอักษรละตินเกือบทั้งหมดและยังรวมถึงตัวอักษรกรีกซีริลลิกคอปติกอาร์เมเนียฮิบรูอารบิกซีรีแอกและทานารวมทั้งการรวมเครื่องหมายกำกับ
จำเป็นต้องใช้สามไบต์สำหรับอักขระในส่วนที่เหลือของเครื่องบินหลายภาษาขั้นพื้นฐานซึ่งมีอักขระแทบทั้งหมดที่ใช้กันทั่วไป [12] รวมทั้งอักขระภาษาจีนญี่ปุ่นและเกาหลี [CJK] ส่วนใหญ่
จำเป็นต้องใช้สี่ไบต์สำหรับอักขระในระนาบอื่น ๆ ของ Unicode ซึ่งรวมถึงอักขระ CJK ที่ใช้น้อยกว่าสคริปต์ประวัติศาสตร์ต่างๆสัญลักษณ์ทางคณิตศาสตร์และอีโมจิ (สัญลักษณ์รูปภาพ)
ที่มา: Wikipedia
UTF-8 ใช้ 1-4 ไบต์ต่ออักขระ: หนึ่งไบต์สำหรับอักขระ ascii (ค่ายูนิโคด 128 ตัวแรกจะเหมือนกับ ascii) แต่ต้องใช้เพียง 7 บิต หากตั้งค่าบิต ("เครื่องหมาย") สูงสุดไว้แสดงว่าเริ่มต้นของลำดับแบบหลายไบต์ จำนวนชุดบิตสูงที่ต่อเนื่องกันแสดงจำนวนไบต์จากนั้นจึงเป็น 0 และบิตที่เหลือจะนำไปสู่ค่า สำหรับไบต์อื่นสองบิตสูงสุดจะเป็น 1 และ 0 และ 6 บิตที่เหลือเป็นค่า
ดังนั้นลำดับสี่ไบต์จะเริ่มต้นด้วย 11110 ... (และ ... = สามบิตสำหรับค่า) จากนั้นสามไบต์กับ 6 บิตต่อค่าโดยให้ค่า 21 บิต 2 ^ 21 เกินจำนวนอักขระ Unicode ดังนั้นจึงสามารถแสดง Unicode ทั้งหมดเป็น UTF8 ได้
ตามตารางนี้ * UTF-8 ควรรองรับ:
2 31 = 2,147,483,648 อักขระ
อย่างไรก็ตาม RFC 3629 จำกัด ค่าที่เป็นไปได้ดังนั้นตอนนี้เราถูกจำกัด ไว้ที่ 4 ไบต์ซึ่งให้เรา
2 21 = 2,097,152 อักขระ
โปรดทราบว่าอักขระเหล่านี้ส่วนใหญ่ "สงวนไว้" สำหรับการใช้งานแบบกำหนดเองซึ่งจริงๆแล้วค่อนข้างสะดวกสำหรับไอคอนฟอนต์
* ใช้ Wikipedia แสดงตารางที่มีขนาด 6 ไบต์ - นับตั้งแต่อัปเดตบทความ
2017-07-11:แก้ไขสำหรับการนับจุดรหัสเดียวกันสองครั้งที่เข้ารหัสด้วยหลายไบต์
0xxxxxxx
ให้ 7 บิตที่ใช้งานได้110xxxxx 10xxxxxx
ให้อีก 11 - ไม่มีการทับซ้อนกัน ไบต์แรกเริ่มต้นด้วย0
ในกรณีแรกและ1
ในกรณีที่สอง
00000001
เก็บอะไรและ11000000 100000001
เก็บอะไร?
Unicode แก้ไขจุดรหัสเป็นอักขระ UTF-8 เป็นกลไกการจัดเก็บสำหรับ Unicode Unicode มีข้อมูลจำเพาะ UTF-8 มีข้อมูลจำเพาะ พวกเขาทั้งสองมีขีด จำกัด ที่แตกต่างกัน UTF-8 มีขอบเขตขึ้นที่แตกต่างกัน
Unicode กำหนดด้วย"เครื่องบิน" เครื่องบินแต่ละลำมีรหัส16จุด2 จุด มี 17 เครื่องบินใน Unicode สำหรับ17 * 2^16
จุดรหัสทั้งหมด เครื่องบินลำแรกที่เครื่องบิน 0 หรือ BMPเป็นพิเศษในน้ำหนักของสิ่งที่จะได้ดำเนินการ
แทนที่จะอธิบายความแตกต่างทั้งหมดให้ฉันอ้างบทความข้างต้นเกี่ยวกับเครื่องบิน
เครื่องบิน 17 ลำรองรับได้ 1,114,112 จุดรหัส ในจำนวนนี้ 2,048 คนเป็นตัวแทนโดย 66 เป็นอักขระที่ไม่ใช่อักขระและ 137,468 ถูกสงวนไว้สำหรับการใช้งานส่วนตัวโดยปล่อยให้ 974,530 คนสำหรับการมอบหมายงานสาธารณะ
ตอนนี้กลับไปที่บทความที่ลิงก์ด้านบน
รูปแบบการเข้ารหัสที่ใช้โดย UTF-8 ได้รับการออกแบบโดยมีขีด จำกัด ที่ใหญ่กว่ามากคือ 2 31จุดรหัส (เครื่องบิน 32,768) และสามารถเข้ารหัส 2 21จุดรหัส (32 ระนาบ) แม้ว่าจะ จำกัด ไว้ที่ 4 ไบต์ก็ตาม เนื่องจาก Unicode จำกัด จุดรหัสไว้ที่เครื่องบิน 17 ลำที่สามารถเข้ารหัสโดย UTF-16 จุดรหัสที่สูงกว่า 0x10FFFF จึงไม่ถูกต้องใน UTF-8 และ UTF-32
คุณจะเห็นว่าคุณสามารถใส่สิ่งต่างๆลงใน UTF-8 ที่ไม่ใช่ Unicode ที่ถูกต้อง ทำไม? เนื่องจาก UTF-8 รองรับจุดรหัสที่ Unicode ไม่รองรับด้วยซ้ำ
UTF-8 แม้จะมีข้อ จำกัด สี่ไบต์ แต่ก็รองรับ 2 21รหัสพอยต์ซึ่งมากกว่า17 * 2^16
2,164,864“ อักขระ” สามารถเข้ารหัสได้โดย UTF-8
ตัวเลขนี้มาจากวิธีการทำงานของการเข้ารหัส:27 + 211 + 216 + 221
อักขระ 1 ไบต์มี 7 บิตสำหรับการเข้ารหัส
0xxxxxxx
(0x00-0x7F)
อักขระ 2 ไบต์มี 11 บิตสำหรับการเข้ารหัส
110xxxxx 10xxxxxx
(0xC0-0xDF สำหรับไบต์แรก 0x80-0xBF สำหรับวินาที)
อักขระ 3 ไบต์มี 16 บิตสำหรับการเข้ารหัส
1110xxxx 10xxxxxx 10xxxxxx
(0xE0-0xEF สำหรับไบต์แรก 0x80-0xBF สำหรับไบต์ต่อเนื่อง)
อักขระ 4 ไบต์มี 21 บิตสำหรับการเข้ารหัส
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
(0xF0-0xF7 สำหรับไบต์แรก 0x80-0xBF สำหรับไบต์ต่อเนื่อง)
ดังที่คุณเห็นว่ามีขนาดใหญ่กว่า Unicode ปัจจุบันอย่างมาก (1,112,064 อักขระ)
อัปเดต
การคำนวณเริ่มต้นของฉันผิดพลาดเพราะไม่ได้พิจารณากฎเพิ่มเติม ดูความคิดเห็นของคำตอบนี้สำหรับรายละเอียดเพิ่มเติม
2^21
และลืมชุดค่าผสมที่เหลือที่เป็นไปได้
UTF-8 คือการเข้ารหัสความยาวตัวแปรโดยมีอย่างน้อย 8 บิตต่ออักขระ
อักขระที่มีจุดรหัสสูงกว่าจะใช้เวลาถึง 32 บิต
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
ดังนั้นจึงสามารถใช้เพียง 21 บิตในการเข้ารหัสอักขระจริง
คำพูดจาก Wikipedia: "UTF-8 เข้ารหัสแต่ละจุดรหัส 1,112,064 จุดในชุดอักขระ Unicode โดยใช้ไบต์ 8 บิตหนึ่งถึงสี่ตัว (เรียกว่า" อ็อกเต็ต "ใน Unicode Standard)"
ลิงค์บางส่วน:
ตรวจสอบมาตรฐาน Unicode และข้อมูลที่เกี่ยวข้องเช่นพวกเขารายการคำถามที่พบบ่อยUTF-8 UTF-16 UTF-32 & BOM ไม่ใช่การแล่นเรือที่ราบรื่น แต่เป็นข้อมูลที่เชื่อถือได้และสิ่งที่คุณอาจอ่านเกี่ยวกับ UTF-8 ที่อื่นเป็นเรื่องที่น่าสงสัย
“ 8” ใน“ UTF-8” เกี่ยวข้องกับความยาวของหน่วยรหัสเป็นบิต หน่วยรหัสคือเอนทิตีที่ใช้ในการเข้ารหัสอักขระไม่จำเป็นต้องเป็นการแมปแบบตัวต่อตัวแบบธรรมดา UTF-8 ใช้จำนวนหน่วยรหัสที่แปรผันเพื่อเข้ารหัสอักขระ
คอลเลกชันของอักขระที่สามารถเข้ารหัสใน UTF-8 นั้นเหมือนกับ UTF-16 หรือ UTF-32 นั่นคืออักขระ Unicode ทั้งหมด พวกเขาทั้งหมดเข้ารหัสพื้นที่การเข้ารหัส Unicode ทั้งหมดซึ่งรวมถึง noncharacters และจุดรหัสที่ไม่ได้กำหนด
แม้ว่าฉันจะเห็นด้วยกับ mpen เกี่ยวกับรหัส UTF-8 สูงสุดในปัจจุบัน (2,164,864) (ตามรายการด้านล่างฉันไม่สามารถแสดงความคิดเห็นเกี่ยวกับเขาได้) เขาจะปิด 2 ระดับหากคุณลบข้อ จำกัด หลัก 2 ข้อของ UTF-8: เพียง 4 ไบต์ ไม่สามารถใช้ขีด จำกัด และรหัส 254 และ 255 ได้ (เขาลบขีด จำกัด 4 ไบต์เท่านั้น)
รหัสเริ่มต้น 254 เป็นไปตามการจัดเรียงพื้นฐานของบิตเริ่มต้น (ตั้งค่าสถานะหลายบิตเป็น 1 จำนวน 6 1 และเทอร์มินัล 0 ไม่มีบิตสำรอง) ให้ 6 ไบต์เพิ่มเติมในการทำงานกับ (6 10xxxxxx กลุ่มเพิ่มเติม 2 ^ 36 รหัส)
รหัสเริ่มต้น 255 ไม่ตรงตามการตั้งค่าพื้นฐานไม่มีเทอร์มินัล 0 แต่ใช้บิตทั้งหมดทำให้คุณมีไบต์เพิ่มเติมอีก 7 ไบต์ (ตั้งค่าสถานะแบบหลายบิตเป็น 1 จำนวน 7 1 และไม่มีเทอร์มินัล 0 เนื่องจากใช้บิตทั้งหมด ; 7 กลุ่ม 10xxxxxx รหัสเพิ่มเติม 2 ^ 42)
การเพิ่มสิ่งเหล่านี้ในชุดอักขระที่นำเสนอได้สูงสุดสุดท้ายคือ 4,468,982,745,216 นี่เป็นมากกว่าอักขระทั้งหมดในการใช้งานปัจจุบันภาษาเก่าหรือภาษาที่ตายแล้วและภาษาที่หลงเชื่อใด ๆ Angelic หรือ Celestial script ใคร?
นอกจากนี้ยังมีรหัสไบต์เดี่ยวที่ถูกมองข้าม / ละเว้นในมาตรฐาน UTF-8 นอกเหนือจาก 254 และ 255: 128-191 และอื่น ๆ อีกเล็กน้อย แป้นพิมพ์บางตัวใช้ในเครื่องตัวอย่างเช่นรหัส 128 มักจะเป็นการลบ backspace รหัสเริ่มต้นอื่น ๆ (และช่วงที่เกี่ยวข้อง) ไม่ถูกต้องด้วยเหตุผลอย่างน้อยหนึ่งข้อ ( https://en.wikipedia.org/wiki/UTF-8#Invalid_byte_sequences )
Unicode แต่งงานกับ UTF-8 อย่างมั่นคง Unicode รองรับโค้ดพอยต์ 2 ^ 21 โดยเฉพาะ (2,097,152 อักขระ) ซึ่งเป็นจำนวนจุดโค้ดที่รองรับโดย UTF-8 ทั้งสองระบบสงวนพื้นที่ 'ตาย' เท่ากันและโซนที่ จำกัด สำหรับจุดรหัสเป็นต้น... ณ เดือนมิถุนายน 2018 Unicode 11.0 เวอร์ชันล่าสุดมีตัวละคร 137,439 ตัว
จากมาตรฐานยูนิโคด. คำถามที่พบบ่อยเกี่ยวกับ Unicode
Unicode Standard เข้ารหัสอักขระในช่วง U + 0000..U + 10FFFF ซึ่งเท่ากับพื้นที่โค้ด 21 บิต
จากหน้า UTF-8 Wikipedia คำอธิบาย UTF-8
เนื่องจากข้อ จำกัด ของ Unicode code-space เป็นค่า 21 บิตในปี 2003 UTF-8 จึงถูกกำหนดให้เข้ารหัสจุดรหัสในหนึ่งถึงสี่ไบต์ ...