การเข้ารหัสอักขระ

เทปพันช์ที่มีคำว่า "Wikipedia" เข้ารหัสในรูปแบบ ASCII การมีอยู่และไม่มีรูแสดงถึง 1 และ 0 ตามลำดับ ตัวอย่างเช่น "W" ถูกเข้ารหัสเป็น "1010111"

การเข้ารหัสอักขระเป็นกระบวนการในการกำหนดตัวเลขให้กับอักขระกราฟิก โดยเฉพาะอักขระที่เป็นลายลักษณ์อักษรในภาษามนุษย์เพื่อให้สามารถจัดเก็บถ่ายโอนและแปลงอักขระเหล่านั้น ได้ โดยใช้คอมพิวเตอร์ดิจิทัล [1]ค่าตัวเลขที่ประกอบเป็นการเข้ารหัสอักขระเรียกว่า " จุดโค้ด " และรวมกันประกอบด้วย "พื้นที่โค้ด" " โค้ดเพจ " หรือ " ผังอักขระ "

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

ประวัติศาสตร์

ประวัติความเป็นมาของรหัสอักขระแสดงให้เห็นถึงความต้องการที่เปลี่ยนแปลงไปสำหรับข้อมูลสัญลักษณ์ที่ใช้อักขระที่ใช้สื่อกลางในระยะไกล โดยใช้วิธีทางไฟฟ้าที่ไม่เคยมีมาก่อน รหัสแรกสุดอิงตามระบบการเข้ารหัสและการเข้ารหัส ที่เขียนด้วยมือและเขียนด้วยลายมือ เช่นรหัสของเบคอน อักษรเบรลล์ธงสัญญาณทางทะเลระหว่างประเทศและการเข้ารหัสตัวอักษรจีน 4 หลักสำหรับรหัสโทรเลขจีน ( Hans Schjellerup , 1869) ด้วยการนำเทคนิคทางไฟฟ้าและเครื่องกลไฟฟ้ามาใช้ รหัสแรกสุดเหล่านี้จึงถูกปรับให้เข้ากับความสามารถและข้อจำกัดใหม่ๆ ของเครื่องจักรในยุคแรกๆ รหัสอักขระที่ส่งผ่านไฟฟ้าที่เก่าแก่ที่สุดที่รู้จักกันดีคือรหัสมอร์สเปิดตัวในคริสต์ทศวรรษ 1840 ใช้ระบบ "สัญลักษณ์" สี่ตัว (สัญญาณสั้น สัญญาณยาว พื้นที่สั้น พื้นที่ยาว) เพื่อสร้างรหัสที่มีความยาวผันแปรได้ แม้ว่าการใช้รหัสมอร์สในเชิงพาณิชย์บางครั้งจะใช้เครื่องจักร แต่ก็มักถูกใช้เป็นรหัสแบบแมนนวล ซึ่งสร้างขึ้นด้วยมือบนปุ่มโทรเลขและถอดรหัสได้ด้วยหู และยังคงมีอยู่ในวิทยุสมัครเล่นและการใช้งานด้านการบิน รหัสส่วนใหญ่มีความยาวคงที่ต่ออักขระหรือลำดับความยาวผันแปรได้ของรหัสที่มีความยาวคงที่ (เช่นUnicode ) [2]

ตัวอย่างทั่วไปของระบบการเข้ารหัสอักขระ ได้แก่ รหัสมอร์ส, รหัส Baudot , รหัส American Standard สำหรับการแลกเปลี่ยนข้อมูล (ASCII) และ Unicode Unicode ซึ่งเป็นระบบการเข้ารหัสที่มีการกำหนดไว้อย่างดีและขยายได้ ได้เข้ามาแทนที่การเข้ารหัสอักขระก่อนหน้านี้ส่วนใหญ่ แต่เส้นทางของการพัฒนาโค้ดจนถึงปัจจุบันค่อนข้างเป็นที่รู้จักกันดี

รหัส Baudot ซึ่งเป็นการเข้ารหัสห้าบิตถูกสร้างขึ้นโดยÉmile Baudotในปี 1870 ได้รับการจดสิทธิบัตรในปี 1874 ดัดแปลงโดย Donald Murray ในปี 1901 และทำให้เป็นมาตรฐานโดย CCITT เป็น International Telegraph Alphabet No. 2 (ITA2) ในปี 1930 ชื่อbaudotมี ถูกนำไปใช้กับ ITA2 และตัวแปรต่างๆ มากมายอย่างไม่ถูกต้อง ITA2 ได้รับความเดือดร้อนจากข้อบกพร่องมากมาย และมักได้รับการปรับปรุงโดยผู้ผลิตอุปกรณ์หลายราย ซึ่งบางครั้งก็สร้างปัญหาความเข้ากันได้ ในปี 1959 กองทัพสหรัฐฯ ได้กำหนดFieldata ของตนรหัส ซึ่งเป็นรหัสหกหรือเจ็ดบิตที่นำมาใช้โดย US Army Signal Corps แม้ว่า Fieldata จะกล่าวถึงปัญหาสมัยใหม่หลายประการในขณะนั้น (เช่น รหัสตัวอักษรและตัวเลขที่จัดเรียงไว้สำหรับการเทียบเคียงเครื่องจักร) แต่ก็ไม่บรรลุเป้าหมายและมีอายุสั้น ในปี 1963 รหัส ASCII แรกได้รับการเผยแพร่ (X3.4-1963) โดยคณะกรรมการ ASCII (ซึ่งมีสมาชิกอย่างน้อยหนึ่งคนในคณะกรรมการ Fieldata, WF Leubbert) ซึ่งกล่าวถึงข้อบกพร่องส่วนใหญ่ของ Fieldata โดยใช้รหัสที่ง่ายกว่า การเปลี่ยนแปลงหลายอย่างเป็นการเปลี่ยนแปลงเล็กๆ น้อยๆ เช่น ชุดอักขระที่เรียงได้ภายในช่วงตัวเลขที่กำหนด ASCII63 ประสบความสำเร็จ ซึ่งได้รับการยอมรับอย่างกว้างขวางในอุตสาหกรรม และด้วยปัญหาการติดตามผลของรหัส ASCII ปี 1967 (ซึ่งเพิ่มตัวอักษรตัวพิมพ์เล็กและแก้ไขปัญหา "รหัสควบคุม") ASCII67 จึงถูกนำมาใช้อย่างกว้างขวางมาตรฐานECMA-6 [3]

บัตรเจาะ Hollerith 80 คอลัมน์ พร้อมชุดอักขระ EBCDIC

Herman Hollerithคิดค้นการเข้ารหัสข้อมูลบัตรเจาะในช่วงปลายศตวรรษที่ 19 เพื่อวิเคราะห์ข้อมูลการสำรวจสำมะโนประชากร ในตอนแรก ตำแหน่งหลุมแต่ละตำแหน่งแสดงถึงองค์ประกอบข้อมูลที่แตกต่างกัน แต่ต่อมา ข้อมูลตัวเลขจะถูกเข้ารหัสโดยการใส่หมายเลขแถวล่าง 0 ถึง 9 โดยมีการเจาะในคอลัมน์แทนหมายเลขแถว ข้อมูลตัวอักษรในภายหลังได้รับการเข้ารหัสโดยอนุญาตให้มีการเจาะมากกว่าหนึ่งรายการต่อคอลัมน์ เครื่องสร้างตารางระบบเครื่องกลไฟฟ้าแสดงวันที่ภายในตามจังหวะเวลาของพัลส์ที่สัมพันธ์กับการเคลื่อนที่ของไพ่ผ่านเครื่อง เมื่อIBMเข้าสู่การประมวลผลทางอิเล็กทรอนิกส์ โดยเริ่มจากIBM 603 Electronic Multiplier นั้น ใช้รูปแบบการเข้ารหัสไบนารีที่หลากหลายซึ่งเชื่อมโยงกับรหัสบัตรเจาะ

Binary Coded Decimal ( BCD ) ของไอบีเอ็มเป็นรูปแบบการเข้ารหัส 6 บิตที่ใช้โดยไอบีเอ็มในช่วงต้นปี พ.ศ. 2496 ใน คอมพิวเตอร์ 702 [4]และ704และในซีรีส์ 7000และซีรีส์ 1400 ในภายหลังตลอดจนอุปกรณ์ต่อพ่วงที่เกี่ยวข้อง เนื่องจากรหัสบัตรเจาะนั้นอนุญาตให้ใช้เฉพาะตัวเลข ตัวอักษรภาษาอังกฤษตัวพิมพ์ใหญ่ และอักขระพิเศษสองสามตัว หกบิตก็เพียงพอแล้ว BCD ขยายการเข้ารหัสตัวเลขสี่บิตแบบธรรมดาที่มีอยู่ให้รวมตัวอักษรและอักขระพิเศษ จับคู่เข้ากับการเข้ารหัสบัตรเจาะซึ่งมีการใช้อย่างแพร่หลายอยู่แล้วได้อย่างง่ายดาย รหัสของ IBM ใช้กับอุปกรณ์ของ IBM เป็นหลัก ผู้จำหน่ายคอมพิวเตอร์รายอื่นๆ ในยุคนั้นมีโค้ดอักขระเป็นของตัวเอง ซึ่งมักจะเป็นแบบ 6 บิต แต่โดยปกติแล้วจะสามารถอ่านเทปที่ผลิตบนอุปกรณ์ของ IBM ได้ BCD เป็นบรรพบุรุษของExtended Binary-Coded Decimal Interchange Code ของ IBM (ปกติจะย่อว่า EBCDIC) ซึ่งเป็นรูปแบบการเข้ารหัส 8 บิตที่พัฒนาขึ้นในปี 1963 สำหรับIBM System/360ที่มีชุดอักขระขนาดใหญ่ รวมทั้งอักษรตัวพิมพ์เล็ก

ในไม่ช้าข้อจำกัดของชุดดังกล่าวก็ปรากฏชัดเจน[ สำหรับใคร? ] และวิธีการ เฉพาะกิจจำนวนหนึ่งได้รับการพัฒนาเพื่อขยายขอบเขตออกไป ความจำเป็นในการสนับสนุนระบบการเขียน เพิ่มเติม สำหรับภาษาต่างๆ รวมถึง ตระกูลสคริปต์เอเชียตะวันออก ของ CJKต้องการการสนับสนุนอักขระจำนวนมากขึ้น และต้องการแนวทางการเข้ารหัสอักขระที่เป็นระบบมากกว่าแนวทางเฉพาะกิจก่อน หน้านี้ [ จำเป็นต้องอ้างอิง ]

ในการพยายามพัฒนาการเข้ารหัสอักขระที่ใช้แทนกันได้ในระดับสากล นักวิจัยในช่วงทศวรรษปี 1980 เผชิญกับภาวะที่กลืนไม่เข้าคายไม่ออก ในด้านหนึ่ง ดูเหมือนว่าจำเป็นต้องเพิ่มบิตเพิ่มเติมเพื่อรองรับอักขระเพิ่มเติม แต่ในทางกลับกัน สำหรับผู้ใช้ชุดอักขระที่ค่อนข้างเล็ก ของอักษรละติน (ซึ่งยังคงเป็นผู้ใช้คอมพิวเตอร์ส่วนใหญ่) บิตเพิ่มเติมเหล่านั้นเป็นการสิ้นเปลืองทรัพยากรคอมพิวเตอร์ที่หายากและมีราคาแพงในขณะนั้นอย่างมหาศาล (เนื่องจากพวกมันจะถูกลบออกเสมอสำหรับผู้ใช้ดังกล่าว) ในปี พ.ศ. 2528 ฮาร์ดดิสก์ไดรฟ์ของผู้ใช้คอมพิวเตอร์ส่วนบุคคลโดยเฉลี่ยสามารถจัดเก็บข้อมูลได้เพียงประมาณ 10 เมกะไบต์ และมีราคาประมาณ 250 เหรียญสหรัฐในตลาดขายส่ง (และสูงกว่ามากหากซื้อแยกต่างหากที่ร้านค้าปลีก) [5]ดังนั้น จึงมีความสำคัญมากในขณะนั้น เพื่อให้ทุกบิตมีค่า

วิธีแก้ปัญหาประนีประนอมที่ค้นพบและพัฒนาเป็น Unicode [ คลุมเครือ ] ในที่สุด คือการทำลายข้อสันนิษฐาน (ย้อนหลังไปถึงรหัสโทรเลข) ที่ว่าอักขระแต่ละตัวควรสอดคล้องกับลำดับบิตเฉพาะเสมอ แต่ก่อนอื่น อักขระจะถูกแมปกับการแสดง ระดับกลางสากลในรูปแบบของตัวเลขนามธรรมที่เรียกว่าจุดรหัส จุดโค้ดจะถูกแสดงในรูปแบบต่างๆ และด้วยจำนวนบิตเริ่มต้นต่างๆ ต่ออักขระ (หน่วยโค้ด) ขึ้นอยู่กับบริบท ในการเข้ารหัสจุดโค้ดที่สูงกว่าความยาวของหน่วยโค้ด เช่น มากกว่า 256 สำหรับหน่วย 8 บิต วิธีแก้ไขคือการใช้การเข้ารหัสที่มีความยาวผันแปรได้โดยที่ลำดับหลีกจะส่งสัญญาณว่าบิตต่อมาควรถูกแยกวิเคราะห์เป็นจุดโค้ดที่สูงกว่า

คำศัพท์เฉพาะทาง

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

  • อักขระเป็นหน่วยข้อความขั้นต่ำที่มีค่าความหมาย [6] [7]
  • ชุดอักขระคือชุดขององค์ประกอบที่ใช้เพื่อแสดงข้อความ [6] [7]ตัวอย่างเช่นตัวอักษรละตินและตัวอักษรกรีกเป็นชุดอักขระทั้งคู่
  • ชุดอักขระที่เข้ารหัสคือชุดอักขระที่แมปกับชุดตัวเลขที่ไม่ซ้ำกัน [7]ด้วยเหตุผลทางประวัติศาสตร์ จึงมักเรียกสิ่งนี้ว่าโค้ดเพจ [6]
  • ละครตัวละครคือชุดของตัวละครที่สามารถแสดงโดยชุดอักขระที่เข้ารหัสโดยเฉพาะ [7] [8]รายการอาจถูกปิด ซึ่งหมายความว่าไม่อนุญาตให้มีการเพิ่มเติมใดๆ โดยไม่สร้างมาตรฐานใหม่ (เช่นในกรณีของ ASCII และซีรีส์ ISO-8859 ส่วนใหญ่) หรืออาจเปิดไว้เพื่อให้สามารถเพิ่มเติมได้ (เช่นในกรณีของ Unicode และในขอบเขตที่จำกัดของWindows code page ) [8]
  • จุดรหัสคือค่าหรือตำแหน่งของอักขระในชุดอักขระที่เข้ารหัส [7]
  • ช่องว่างโค้ดคือช่วงของค่าตัวเลขที่ขยายโดยชุดอักขระที่เข้ารหัส [7] [9]
  • หน่วยโค้ดคือชุดบิตขั้นต่ำที่สามารถแสดงอักขระในการเข้ารหัสอักขระได้ (ใน แง่ วิทยาการคอมพิวเตอร์คือ ขนาด คำของการเข้ารหัสอักขระ) [7] [9]ตัวอย่างเช่น หน่วยโค้ดทั่วไปได้แก่ 7 บิต 8 บิต 16 บิต และ 32 บิต ในการเข้ารหัสบางตัว อักขระบางตัวจะถูกเข้ารหัสโดยใช้หลายหน่วยโค้ด การเข้ารหัสดังกล่าวเรียกว่า การเข้ารหัสแบบความ กว้างตัวแปร

หน้ารหัส

"โค้ดเพจ" คือชื่อในอดีตของชุดอักขระที่เข้ารหัส

เดิมที โค้ดเพจอ้างอิงถึงหมายเลขหน้า เฉพาะ ในคู่มือชุดอักขระมาตรฐานของ IBM ซึ่งจะกำหนดการเข้ารหัสอักขระเฉพาะ ผู้จำหน่ายราย อื่นๆ รวมถึงMicrosoft , SAPและOracle Corporationก็เผยแพร่ชุดโค้ดเพจของตนเองเช่นกัน ชุดโค้ดเพจที่รู้จักกันดีที่สุดคือ " Windows " (อิงตาม Windows-1252) และ "IBM"/"DOS" (อิงตามโค้ดเพจ 437 )

แม้ว่าจะไม่อ้างอิงถึงหมายเลขหน้าเฉพาะอีกต่อไปในมาตรฐานแล้ว แต่การเข้ารหัสอักขระจำนวนมากยังคงอ้างอิงตามหมายเลขหน้าโค้ด ในทำนองเดียวกัน คำว่า "โค้ดเพจ" มักจะยังคงใช้เพื่ออ้างถึงการเข้ารหัสอักขระโดยทั่วไป

คำว่า "โค้ดเพจ" ไม่ได้ใช้ใน Unix หรือ Linux โดยที่แนะนำให้ใช้ "charmap" ซึ่งมักจะอยู่ในบริบทที่ใหญ่กว่าของภาษา Character Data Representation Architecture (CDRA) ของ IBM กำหนดเอนทิตีด้วยตัวระบุชุดอักขระโค้ด ( CCSIDs ) ซึ่งแต่ละชุดเรียกกันหลากหลายว่า "ชุดอักขระ", "ชุดอักขระ", "โค้ดเพจ" หรือ "CHARMAP" [9]

หน่วยรหัส

ขนาดหน่วยโค้ดเทียบเท่ากับการวัดบิตสำหรับการเข้ารหัสเฉพาะ:

  • หน่วยโค้ดในUS-ASCIIประกอบด้วย 7 บิต;
  • หน่วยโค้ดในUTF-8 , EBCDICและGB 18030ประกอบด้วย 8 บิต
  • หน่วยโค้ดในUTF-16ประกอบด้วย 16 บิต
  • หน่วยโค้ดในUTF-32ประกอบด้วย 32 บิต

จุดรหัส

จุดโค้ดจะแสดงด้วยลำดับของหน่วยโค้ด การแมปถูกกำหนดโดยการเข้ารหัส ดังนั้น จำนวนหน่วยโค้ดที่ต้องใช้ในการแสดงจุดโค้ดจึงขึ้นอยู่กับการเข้ารหัส:

  • UTF-8: จุดโค้ดแมปกับลำดับของหน่วยโค้ดหนึ่ง, สอง, สามหรือสี่หน่วย
  • UTF-16: หน่วยโค้ดมีความยาวเป็นสองเท่าของหน่วยโค้ด 8 บิต ดังนั้น จุดโค้ดใดๆ ที่มีค่าสเกลาร์น้อยกว่า U+10000 จะถูกเข้ารหัสด้วยหน่วยโค้ดเดียว รหัสพอยต์ที่มีค่า U+10000 หรือสูงกว่านั้นต้องใช้โค้ดสองหน่วยต่อหน่วย หน่วยโค้ดคู่เหล่านี้มีคำเฉพาะใน UTF-16: "คู่ตัวแทน Unicode"
  • UTF-32: หน่วยโค้ด 32 บิตมีขนาดใหญ่พอที่จะแสดงทุกจุดโค้ดเป็นหน่วยโค้ดเดียว
  • GB 18030: หลายหน่วยโค้ดต่อจุดโค้ดเป็นเรื่องธรรมดา เนื่องจากมีหน่วยโค้ดขนาดเล็ก จุดรหัสถูกแมปกับหน่วยรหัสหนึ่ง สอง หรือสี่หน่วย [11]

ตัวละคร

สิ่งที่ประกอบขึ้นเป็นอักขระนั้นแตกต่างกันไปตามการเข้ารหัสอักขระ

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

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

รูปแบบการเข้ารหัส Unicode

Unicodeและมาตรฐานคู่ขนาน ISO/IEC 10646 Universal Character Setรวมกันเป็นมาตรฐานแบบครบวงจรสำหรับการเข้ารหัสอักขระ แทนที่จะจับคู่อักขระโดยตรงกับไบต์ Unicode จะกำหนดชุดอักขระโค้ดแยกกันที่จับคู่อักขระกับตัวเลขธรรมชาติที่ไม่ซ้ำกัน ( จุดโค้ด ) วิธีจับคู่จุดโค้ดเหล่านั้นกับชุดของตัวเลขธรรมชาติขนาดคงที่ (หน่วยโค้ด) และสุดท้ายอย่างไร หน่วยเหล่านั้นถูกเข้ารหัสเป็นสตรีมของออคเท็ต (ไบต์) จุดประสงค์ของการสลายตัวนี้คือเพื่อสร้างชุดอักขระสากลที่สามารถเข้ารหัสได้หลายวิธี เพื่ออธิบายโมเดลนี้อย่างแม่นยำ ยูนิโค้ดใช้ชุดคำศัพท์ของตัวเองเพื่ออธิบายกระบวนการ: [9]

ละครตัวละครนามธรรม (ACR) คือชุดอักขระนามธรรมครบชุดที่ระบบรองรับ Unicode มีรายการเพลงแบบเปิด ซึ่งหมายความว่าตัวละครใหม่จะถูกเพิ่มเข้าไปในรายการเมื่อเวลาผ่านไป

ชุดอักขระที่เข้ารหัส (CCS) คือฟังก์ชันที่จับคู่อักขระกับจุดโค้ด (จุดโค้ดแต่ละจุดแทนอักขระหนึ่งตัว) ตัวอย่างเช่น ในละครที่กำหนด ตัวอักษรตัวใหญ่ "A" ในตัวอักษรละตินอาจแสดงด้วยรหัสจุด 65 อักขระ "B" ถึง 66 และอื่นๆ ชุดอักขระที่เข้ารหัสหลายชุดอาจใช้ชุดอักขระเดียวกัน ตัวอย่างเช่นISO/IEC 8859-1และโค้ดเพจ IBM 037และ500ทั้งหมดครอบคลุมรายการเดียวกัน แต่แมปกับจุดโค้ดที่แตกต่างกัน

รูปแบบการเข้ารหัสอักขระ (CEF) คือการแมปจุดโค้ดกับหน่วยโค้ดเพื่ออำนวยความสะดวกในการจัดเก็บในระบบที่แสดงตัวเลขเป็นลำดับบิตที่มีความยาวคงที่ (เช่น ในทางปฏิบัติระบบคอมพิวเตอร์ใดๆ ก็ตาม) ตัวอย่างเช่น ระบบที่จัดเก็บข้อมูลตัวเลขในหน่วย 16 บิตสามารถแสดงจุดรหัส 0 ถึง 65,535 โดยตรงในแต่ละหน่วยเท่านั้น แต่จุดรหัสที่ใหญ่กว่า (เช่น 65,536 ถึง 1.4 ล้าน) สามารถแสดงได้โดยใช้หน่วย 16 บิตหลายหน่วย จดหมายโต้ตอบนี้กำหนดโดย CEF

รูปแบบการเข้ารหัสอักขระ (CES) คือการแมปหน่วยโค้ดกับลำดับของออคเต็ตเพื่ออำนวยความสะดวกในการจัดเก็บข้อมูลบนระบบไฟล์แบบออคเต็ตหรือการส่งผ่านเครือข่ายแบบออคเต็ต รูปแบบการเข้ารหัสอักขระอย่างง่าย ได้แก่UTF-8 , UTF-16BE , UTF-32BE , UTF-16LEและUTF-32LE ; รูปแบบการเข้ารหัสอักขระผสม เช่นUTF-16 , UTF-32และISO/IEC 2022 สลับระหว่างรูปแบบง่ายๆ หลายรูป แบบโดยใช้เครื่องหมายลำดับไบต์หรือลำดับหลีก รูปแบบการบีบอัดพยายามลดจำนวนไบต์ที่ใช้ต่อหน่วยโค้ด (เช่นSCSUและโบซียู )

แม้ว่าUTF-32BEและUTF-32LEจะเป็น CES ที่ง่ายกว่า แต่ระบบส่วนใหญ่ที่ทำงานกับ Unicode จะใช้UTF-8ซึ่งสามารถเข้ากันได้แบบย้อนหลังกับ ASCII ที่มีความยาวคงที่ และแมปโค้ด Unicode จะชี้ไปที่ลำดับความยาวผันแปรของออคเต็ต หรือUTF -16BE [ ต้องการอ้างอิง ]ซึ่งเข้ากันได้แบบย้อนหลังกับ UCS-2BE ที่มีความยาวคงที่ และแมปโค้ด Unicode ชี้ไปที่ลำดับความยาวผันแปรของคำ 16 บิต ดูการเปรียบเทียบการเข้ารหัส Unicodeสำหรับการสนทนาโดยละเอียด

สุดท้ายนี้ อาจมีโปรโตคอลระดับที่สูงกว่าซึ่งให้ข้อมูลเพิ่มเติมเพื่อเลือกรูปแบบเฉพาะของ อักขระ Unicodeโดยเฉพาะอย่างยิ่งเมื่อมีรูปแบบภูมิภาคที่ 'รวมเป็นหนึ่ง' ใน Unicode เป็นอักขระเดียวกัน ตัวอย่างคือ แอตทริบิวต์ XML xml:lang

โมเดล Unicode ใช้คำว่า "ผังอักขระ" สำหรับระบบอื่นๆ ที่กำหนดลำดับอักขระให้กับลำดับไบต์โดยตรง ซึ่งครอบคลุมเลเยอร์ CCS, CEF และ CES ทั้งหมด [9]

จุดโค้ด Unicode

ใน Unicode อักขระสามารถเรียกว่า 'U+' ตามด้วยค่าจุดรหัสเป็นเลขฐานสิบหก ช่วงของจุดโค้ดที่ถูกต้อง (โค้ดสเปซ) สำหรับมาตรฐาน Unicode คือ U+0000 ถึง U+10FFFF รวมทั้งหมด แบ่งออกเป็น 17 ระนาบระบุด้วยตัวเลข 0 ถึง 16 อักขระในช่วง U+0000 ถึง U+FFFF คือ ในระนาบ 0 เรียกว่าBasic Multilingual Plane (BMP) เครื่องบินลำนี้มีอักขระที่ใช้บ่อยที่สุด อักขระในช่วง U+ 10000 ถึง U+10FFFF ในระนาบอื่นเรียกว่าอักขระเสริม

ตารางต่อไปนี้แสดงตัวอย่างค่าจุดโค้ด:

อักขระ จุดรหัส Unicode สัญลักษณ์
ละตินเอ ยู+0041 เอ
ละตินชาร์ป S U+00DF ß
ฮั่นตะวันออก ยู+6771
เครื่องหมาย ยู+0026 &
เครื่องหมายอัศเจรีย์กลับหัว ยู+00A1 ¡
ป้ายมาตรา ยู+00A7 §

ตัวอย่าง

พิจารณาสตริงของตัวอักษร "ab̲c𐐀" ซึ่งก็คือสตริงที่มีอักขระผสม Unicode ( U+0332 ̲ ) รวมถึงอักขระเสริม ( U+10400 𐐀 ). สตริงนี้มีการแสดง Unicode หลายรายการซึ่งเทียบเท่ากันในเชิงตรรกะ แต่ถึงแม้ว่าแต่ละรายการจะเหมาะสมกับชุดของสถานการณ์หรือข้อกำหนดที่หลากหลาย:

  • สี่ตัวละครที่แต่ง :
    a, , c,𐐀
  • ห้ากราฟ :
    a, b, _, c,𐐀
  • ห้าจุดรหัส Unicode :
    U+0061, U+0062, U+0332, U+0063,U+10400
  • ห้าหน่วยรหัส UTF-32 (ค่าจำนวนเต็ม 32 บิต):
    0x00000061, 0x00000062, 0x00000332, 0x00000063,0x00010400
  • หกหน่วยรหัส UTF-16 (จำนวนเต็ม 16 บิต)
    0x0061, 0x0062, 0x0332, 0x0063, 0xD801,0xDC00
  • หน่วยรหัส UTF-8 เก้าหน่วย (ค่า 8 บิตหรือbytes )
    0x61, 0x62, 0xCC, 0xB2, 0x63, 0xF0, 0x90, 0x90,0x80

โปรดทราบว่า 𐐀 จะแสดงด้วยค่า 32 บิตหนึ่งค่า (UTF-32), ค่า 16 บิตสองค่า (UTF-16) หรือค่า 8 บิตสี่ค่า (UTF-8) แม้ว่าแต่ละรูปแบบจะใช้จำนวนบิตทั้งหมด (32) เท่ากันในการแสดงสัญลักษณ์ แต่ก็ไม่ชัดเจนว่าค่าไบต์ตัวเลขจริงเกี่ยวข้องกันอย่างไร

การแปลงรหัส

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

ข้ามแพลตฟอร์ม :

  • เว็บเบราว์เซอร์ – เว็บเบราว์เซอร์สมัยใหม่ส่วนใหญ่มีการตรวจจับการเข้ารหัสอักขระอัตโนมัติ ตัวอย่างเช่น บน Firefox 3 โปรดดูเมนูย่อยการเข้ารหัสมุมมอง/อักขระ
  • iconv – โปรแกรมและ API มาตรฐานสำหรับแปลงการเข้ารหัส
  • luit – โปรแกรมที่แปลงการเข้ารหัสอินพุตและเอาต์พุตเป็นโปรแกรมที่ทำงานแบบโต้ตอบ
  • Convert_encoding.py - ยูทิลิตี้ที่ใช้ Python เพื่อแปลงไฟล์ข้อความระหว่างการเข้ารหัสที่กำหนดเองและการสิ้นสุดบรรทัด[12]
  • decodeh.py – อัลกอริธึมและโมดูลเพื่อคาดเดาการเข้ารหัสของสตริงแบบฮิวริสติก[13]
  • ส่วนประกอบสากลสำหรับ Unicode – ชุดของไลบรารี C และ Java เพื่อทำการแปลงชุดอักขระ uconv สามารถใช้งานได้จาก ICU4C
  • chardet - นี่คือการแปลโค้ด การตรวจจับการเข้ารหัสอัตโนมัติ ของ Mozillaเป็นภาษาคอมพิวเตอร์ Python
  • คำสั่ง ไฟล์ Unix เวอร์ชันใหม่กว่าพยายามตรวจจับการเข้ารหัสอักขระขั้นพื้นฐาน (มีให้ใช้งานในCygwin ด้วย )
  • ชุดอักขระ - ไลบรารีเทมเพลตC++ พร้อมอินเทอร์เฟซที่เรียบง่ายสำหรับการแปลงระหว่างสตรีม C++/ที่ผู้ใช้กำหนด ชุดอักขระกำหนดชุดอักขระจำนวน มากและอนุญาตให้คุณใช้รูปแบบ Unicode ที่รองรับendianness

เหมือน Unix :

  • cmv – เครื่องมือง่ายๆ สำหรับการแปลงรหัสชื่อไฟล์ [14]
  • convmv – แปลงชื่อไฟล์จากการเข้ารหัสหนึ่งไปเป็นอีกการเข้ารหัสหนึ่ง [15]
  • cstocs – แปลงเนื้อหาไฟล์จากการเข้ารหัสหนึ่งไปเป็นอีกภาษาหนึ่งสำหรับภาษาเช็กและสโลวัก
  • enca – วิเคราะห์การเข้ารหัสสำหรับไฟล์ข้อความที่กำหนด [16]
  • recode – แปลงเนื้อหาไฟล์จากการเข้ารหัสหนึ่งไปเป็นอีกการเข้ารหัสหนึ่ง [17]
  • utrac – แปลงเนื้อหาไฟล์จากการเข้ารหัสหนึ่งไปเป็นอีกการเข้ารหัสหนึ่ง [18]

หน้าต่าง :

  • การเข้ารหัส แปลง – .NET API [19]
  • MultiByteToWideChar / WideCharToMultiByte - เพื่อแปลงจาก ANSI เป็น Unicode และ Unicode เป็น ANSI [20] [21]
  • cscvt – เครื่องมือแปลงชุดอักขระ[22]
  • enca – วิเคราะห์การเข้ารหัสสำหรับไฟล์ข้อความที่กำหนด [23]

ดูสิ่งนี้ด้วย

การเข้ารหัสอักขระทั่วไป

  • ISO 646
  • เอ็บซีดิก
  • ISO 8859 :
    • ISO 8859-1ยุโรปตะวันตก
    • ISO 8859-2ยุโรปตะวันตกและกลาง
    • ISO 8859-3ยุโรปตะวันตกและยุโรปใต้ (ตุรกี มอลตา และเอสเปรันโต)
    • ISO 8859-4ยุโรปตะวันตกและประเทศบอลติก (ลิทัวเนีย เอสโตเนีย ลัตเวีย และแลปป์)
    • ISO 8859-5อักษรซีริลลิก
    • ISO 8859-6ภาษาอาหรับ
    • ISO 8859-7ภาษากรีก
    • ISO 8859-8ภาษาฮิบรู
    • ISO 8859-9ยุโรปตะวันตกพร้อมชุดอักขระภาษาตุรกีที่แก้ไขเพิ่มเติม
    • ISO 8859-10ยุโรปตะวันตกพร้อมชุดอักขระที่มีเหตุผลสำหรับภาษานอร์ดิก รวมถึงชุดภาษาไอซ์แลนด์ที่สมบูรณ์
    • ISO 8859-11ไทย
    • ISO 8859-13ภาษาบอลติกบวกภาษาโปแลนด์
    • ISO 8859-14ภาษาเซลติก (เกลิกไอริช สก็อตแลนด์ เวลส์)
    • ISO 8859-15เพิ่มเครื่องหมายยูโรและเหตุผลอื่นๆ ลงใน ISO 8859-1
    • ISO 8859-16ภาษายุโรปกลาง ตะวันออก และใต้ (แอลเบเนีย บอสเนีย โครเอเชีย ฮังการี โปแลนด์ โรมาเนีย เซอร์เบีย และสโลวีเนีย แต่ยังรวมไปถึงภาษาฝรั่งเศส เยอรมัน อิตาลี และเกลิคไอริช)
  • CP437 , CP720 , CP737 , CP850 , CP852 , CP855 , CP857 , CP858 , CP860 , CP861 , CP862 , CP863 , CP865 , CP866 , CP869 , CP872
  • ชุดอักขระ MS-Windows :
    • Windows-1250สำหรับภาษายุโรปกลางที่ใช้สคริปต์ละติน (โปแลนด์ เช็ก สโลวัก ฮังการี สโลวีเนีย เซอร์เบีย โครเอเชีย บอสเนีย โรมาเนีย และแอลเบเนีย)
    • Windows-1251สำหรับตัวอักษรซีริลลิก
    • Windows-1252สำหรับภาษาตะวันตก
    • Windows-1253สำหรับภาษากรีก
    • Windows-1254สำหรับภาษาตุรกี
    • Windows-1255สำหรับภาษาฮิบรู
    • Windows-1256สำหรับภาษาอาหรับ
    • Windows-1257สำหรับภาษาบอลติก
    • Windows-1258สำหรับภาษาเวียดนาม
  • แมคโอเอส โรมัน
  • KOI8-R , KOI8-U , KOI7
  • มิค
  • ไอเอสซีไอ
  • สสส
  • วิสซีไอ
  • JIS X 0208เป็นมาตรฐานที่ใช้กันอย่างแพร่หลายสำหรับการเข้ารหัสอักขระภาษาญี่ปุ่นซึ่งมีรูปแบบการเข้ารหัสหลายรูปแบบ
  • JIS X 0213เป็นเวอร์ชันขยายของ JIS X 0208
  • กัวเปียวจีน
  • Taiwan Big5 (ตัวแปรที่มีชื่อเสียงกว่าคือ Microsoft Code หน้า 950 )
  • เกาหลี
    • KS X 1001เป็นมาตรฐานการเข้ารหัสอักขระไบต์คู่ภาษาเกาหลี
    • EUC-KR
    • ISO-2022-KR
  • Unicode (และชุดย่อย เช่น 'Basic Multilingual Plane' แบบ 16 บิต)
  • ANSELหรือISO/IEC 6937

อ้างอิง

  1. คำจำกัดความจากพจนานุกรมข้อกำหนดทางเทคนิค
  2. ทอม เฮนเดอร์สัน (17 เมษายน พ.ศ. 2557) "ตารางรหัสอักขระคอมพิวเตอร์โบราณ - และเหตุใดจึงยังเกี่ยวข้อง" สมาร์ทแบร์. สืบค้นเมื่อ29 เมษายน 2014 .
  3. ทอม เจนนิงส์ (1 มีนาคม พ.ศ. 2553) "ประวัติคำอธิบายประกอบของรหัสอักขระบางตัว" . สืบค้นเมื่อ1 พฤศจิกายน 2018 .
  4. "เครื่องประมวลผลข้อมูลอิเล็กทรอนิกส์ IBM ประเภท 702 คู่มือข้อมูลเบื้องต้น" (PDF ) 2497. หน้า. 80. 22-6173-1. เก็บถาวร(PDF)จากต้นฉบับเมื่อวันที่ 9 ตุลาคม 2022
  5. สเตรลโญ่, เควิน (15 เมษายน พ.ศ. 2528) "IBM ขับเคลื่อนฮาร์ดดิสก์สู่มาตรฐานใหม่" อินโฟเวิลด์ . Popular Computing Inc. หน้า29–33 สืบค้นเมื่อ10 พฤศจิกายน 2020 .
  6. ↑ abcd ชอว์น สตีล (15 มีนาคม พ.ศ. 2548) "การเข้ารหัส โค้ดเพจ ชุดอักขระ และ Unicode แตกต่างกันอย่างไร" ไมโครซอฟต์ เอกสาร .
  7. ↑ abcdefg "อภิธานศัพท์ของข้อกำหนด Unicode" สมาคมยูนิโค้ด
  8. ↑ ab "บทที่ 3: ความสอดคล้อง". Unicode Standard เวอร์ชัน 15.0 – ข้อมูลจำเพาะหลัก(PDF ) สมาคมยูนิโค้ด กันยายน 2022 ISBN 978-1-936213-32-0.
  9. ↑ abcde วิสต์เลอร์, เคน; เฟรย์แท็ก, อัสมุส (11 พฤศจิกายน 2565). "UTR#17: โมเดลการเข้ารหัสอักขระ Unicode" สมาคมยูนิโค้ด สืบค้นเมื่อ12 สิงหาคม 2566 .
  10. "ข้อมูลโปรแกรมเมอร์เทอร์มินัลวิดีโอ VT510" บริษัท อุปกรณ์ดิจิทัล (DEC) 7.1. ชุดอักขระ - ภาพรวม เก็บถาวรจากต้นฉบับเมื่อ 26 มกราคม 2016 . สืบค้นเมื่อ 15 กุมภาพันธ์ 2560 . นอกเหนือจาก ชุดอักขระ DECและISO แบบดั้งเดิม ซึ่งสอดคล้องกับโครงสร้างและกฎของISO 2022แล้ว VT510 ยังรองรับโค้ดเพจ IBM PC จำนวนหนึ่ง ( หมายเลขหน้าในคู่มือชุดอักขระมาตรฐานของ IBM) ในโหมด PCTerm เพื่อจำลองคอนโซลเทอร์มินัลของ พีซีมาตรฐานอุตสาหกรรม
  11. ^ "คำศัพท์ (บทช่วยสอน Java)" ออราเคิล. สืบค้นเมื่อ25 มีนาคม 2561 .
  12. แปลง encoding.py บนGitHub
  13. "Decodeh – ถอดรหัสสตริงหรือไฟล์ข้อความแบบฮิวริสติก" เก็บถาวรจากต้นฉบับเมื่อวันที่ 8 มกราคม พ.ศ. 2551
  14. "CharsetMove – เครื่องมืออย่างง่ายสำหรับการเปลี่ยนชื่อไฟล์"
  15. "Convmv – แปลงชื่อไฟล์จากการเข้ารหัสหนึ่งไปเป็นอีกการเข้ารหัสหนึ่ง"
  16. ^ "เครื่องวิเคราะห์ Charset ที่ไร้เดียงสาอย่างยิ่ง" เก็บถาวรจากต้นฉบับเมื่อ 4 ธันวาคม 2010 . สืบค้นเมื่อ11 มีนาคม 2551 .
  17. โค้ดใหม่บนGitHub
  18. "โฮมเพจยูแทรค".
  19. ^ "วิธีการเข้ารหัส แปลง" ไลบรารีคลาส Microsoft .NET Framework
  20. "ฟังก์ชัน MultiByteToWideChar (stringapiset.h)" ไมโครซอฟต์ เอกสาร . 13 ตุลาคม 2021.
  21. "ฟังก์ชัน WideCharToMultiByte (stringapiset.h)" ไมโครซอฟต์ เอกสาร . 9 สิงหาคม 2565
  22. "ตัวแปลงชุดอักขระของ Kalytta"
  23. "Enca binary คอมไพล์สำหรับ Windows 32 บิต" เก็บถาวรจากต้นฉบับเมื่อ 15 มีนาคม 2012 . สืบค้นเมื่อ31 มีนาคม 2554 .

อ่านเพิ่มเติม

ลิงค์ภายนอก

  • ชุดอักขระที่ลงทะเบียนโดย Internet Assigned Numbers Authority (IANA)
  • ตัวละครและการเข้ารหัส โดย Jukka Korpela
  • รายงานทางเทคนิค Unicode #17: โมเดลการเข้ารหัสอักขระ
  • รหัสอักขระทศนิยมและเลขฐานสิบหกใน HTML Unicode – ตัวแปลงการเข้ารหัส
  • ขั้นต่ำที่แน่นอนที่นักพัฒนาซอฟต์แวร์ทุกคนต้องรู้อย่างแน่นอนเกี่ยวกับ Unicode และชุดอักขระ (ไม่มีข้อแก้ตัว!) โดย Joel Spolsky (10 ต.ค. 2546)