ทำไม“ charset” ถึงมีความหมายว่า“ การเข้ารหัส” ในการใช้งานทั่วไป?


10

สิ่งที่ทำให้ฉันสับสนมานานคือซอฟต์แวร์จำนวนมากใช้คำว่า "charset" และ "encoding" เป็นคำพ้องความหมาย

เมื่อผู้คนอ้างถึงยูนิโค้ด "เข้ารหัส" พวกเขามักจะหมายถึงชุดกฎสำหรับการแสดงอักขระยูนิโค้ดเป็นลำดับของไบต์ - เช่น ASCII หรือ UTF-8 ดูเหมือนว่าสมเหตุสมผลและเป็นธรรมชาติ แนวคิดคือคุณกำลัง "เข้ารหัส" อักขระเหล่านั้นเป็นไบต์โดยใช้ ruleset ที่ระบุ

เนื่องจากบางครั้ง rulesets เหล่านั้นให้ความสามารถในการ "เข้ารหัส" เซ็ตย่อยบางส่วนของอักขระยูนิโค้ดทั้งหมดคุณอาจจินตนาการว่า "charset" - ย่อมาจาก 'set of characters' - จะหมายถึงชุดของอักขระ Unicode - โดยไม่คำนึงถึงวิธีการ อักขระเหล่านั้นถูกเข้ารหัส การเข้ารหัสจึงหมายถึงชุดอักขระ (การเข้ารหัสเช่น ASCII ซึ่งมีกฎสำหรับการเข้ารหัสอักขระ 128 ตัวเท่านั้นจะเชื่อมโยงกับชุดอักขระของอักขระ 128 ตัว) แต่ชุดอักขระไม่จำเป็นต้องมีการเข้ารหัส (เช่น UTF-8, UTF -16 และ UTF-32 เป็นการเข้ารหัสที่แตกต่างกันทั้งหมด แต่สามารถเข้ารหัสชุดอักขระเดียวกันได้)

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

ตัวอย่างเช่น:

  • charsetแอตทริบิวต์ใน HTML ถูกใช้เพื่อระบุการเข้ารหัส
  • Charsets ใน Java เป็นการเข้ารหัส
  • charsets และcharacter setsใน MySQL มีการเข้ารหัสอีกครั้ง

การใช้ภาษานี้แปลกมากเพียงใดและคำจำกัดความที่ต่อต้านการหยั่งรู้ของ 'ชุดอักขระ' นี้มีมานานแค่ไหน? มันไม่อาจจะมาจากช่วงเวลาที่มีอย่างแท้จริงเป็นในทางปฏิบัติการทำแผนที่หนึ่งต่อหนึ่งระหว่างการเข้ารหัสในการใช้งานและชุดของตัวละครที่พวกเขาได้รับการสนับสนุน? หรือมีมาตรฐานหรือสเปคที่มีอิทธิพลโดยเฉพาะซึ่งกำหนดคำจำกัดความของคำนี้หรือไม่?


5
การใช้charsetมาตรฐาน Unicode มาก่อนดังนั้นในขณะที่อาจไม่ได้เป็น "การทำแผนที่แบบหนึ่งต่อหนึ่ง" อักขระที่จำเป็นสำหรับเอกสารมีแนวโน้มที่จะบังคับให้เลือกการเข้ารหัส แต่ฉันไม่มีเวลาค้นคว้าประวัติความเป็นจริงของคำว่า ...
AmeliaBR

2
คุณพูดถึงชุดอักขระเป็น "ชุดของอักขระ Unicode" ราวกับว่ามีคนเริ่มต้นด้วย Unicode แล้วเลือกชุดย่อย มันแม่นยำมากกว่าที่จะบอกว่ามีชุดอักขระจำนวนมากที่มีอยู่ก่อนการประดิษฐ์ของ Unicode (หรืออย่างน้อยก่อนที่ Unicode จะแพร่หลาย) และ Unicode นั้นถูกสร้างขึ้นโดยเจตนาเพื่อให้เป็น superset ของพวกเขา
John Bartholomew

คำตอบ:


3

แนวคิดของชุดอักขระนั้นเก่ากว่า Unicode

ก่อน Unicode ชุดอักขระจะกำหนดชุดของอักขระและวิธีที่อักขระแต่ละตัวแสดงเป็นบิต อักขระส่วนใหญ่ตั้งค่าอักขระเป็นไบต์ (ซึ่งอนุญาตให้ใช้ชุดอักขระ 256 ตัว) บางตัวถูกแมปกับสองไบต์และไม่กี่ (เช่น ASCII) เพียง 7 บิต ชุดอักขระที่แตกต่างกันมักจะกำหนดค่าที่แตกต่างให้กับอักขระเดียวกันและไม่มีคีย์การแปลสากลระหว่างชุดอักขระต่างๆที่ใช้งานอยู่

Unicode เป็นความพยายามในการแก้ปัญหานี้โดยการรวมชุดอักขระต่าง ๆ ทั้งหมดใน "superset" ทั่วไป เพื่อจุดประสงค์นี้ Unicode แนะนำระดับเพิ่มเติมของ abstraction ตัวอย่างเช่นแนวคิดของการเข้ารหัสอักขระเป็นสิ่งที่แยกจากค่ารหัสจุด สิ่งนี้ทำให้ Unicode อนุญาตให้กำหนดอักขระpre-unicode ใหม่เป็นการเข้ารหัสอักขระ unicode

แอ็ตทริบิวต์ charset ใน HTML (ซึ่งทำมิรเรอร์พารามิเตอร์ charset ในส่วนหัวของชนิดเนื้อหา HTTP) มาจากก่อนที่ unicode จะถูกนำมาใช้อย่างกว้างขวาง แต่เมื่อตัดสินใจว่าจะยอมรับ unicode เป็นชุดอักขระสากลของอินเทอร์เน็ตแอตทริบิวต์ charset เพิ่งถูกนิยามใหม่เพื่อระบุการเข้ารหัสที่ใช้งานอยู่ แต่ชื่อนั้นไม่ได้ถูกเปลี่ยนเพื่อให้เข้ากันได้ย้อนหลัง


9

คำว่า "charset" เป็นหลักสูตรสั้นสำหรับ "ชุดอักขระ" ซึ่งในทางกลับกันเป็นคำเก่าที่ใช้สำหรับการเข้ารหัสอักขระซึ่งสามารถตีความได้ว่าเป็น) การแมประหว่างลำดับของไบต์และอักขระ b) การแมประหว่างจำนวนเต็ม (หมายเลขรหัส) และอักขระหรือ c) การแมประหว่างอักขระนามธรรมและจำนวนเต็มหรือลำดับไบต์

“ ชุดตัวละคร” ถูกนำไปใช้เพราะมันเป็นการแสดงออกที่สั้นและเรียบง่าย ในนั้น "ชุด" มีความหมายที่คลุมเครือ (ในขณะที่แนวคิดทั้งหมดคลุมเครือ) แต่ต่อมามักจะถูกตีความผิดเป็นชุด ("ชุด" ในความหมายเชิงทฤษฎีเซต) ตามที่อธิบายไว้ในชุดอักขระที่มีชื่อเสียงของ Dan Connelly พิจารณาอันตราย

สิ่งที่สำคัญที่สุดคือตัวระบุcharsetถูกนำไปใช้ใน MIME และ HTTP HTTP 1.0นามแฝง RFC 1945 อ้างอิงคำนิยาม MIME“ วิธีการที่ใช้กับหนึ่งตารางขึ้นไปเพื่อแปลงลำดับของ octets เป็นลำดับของอักขระ” จากนั้นให้ข้อคิดเห็นเกี่ยวกับความสับสน:“ การใช้คำว่า 'ชุดอักขระ' นี้มีมากกว่า โดยทั่วไปเรียกว่า 'การเข้ารหัสอักขระ' อย่างไรก็ตามเนื่องจาก HTTP และ MIME ใช้รีจิสทรีเดียวกันร่วมกันสิ่งสำคัญคือต้องใช้คำศัพท์ร่วมกัน”


1

RFC2045แนะนำ "ชุดอักขระ" เป็น MIME และในเวลานั้นมันชัดเจนแล้วว่าไม่ใช่การเข้ารหัสทั้งหมดที่แมปหนึ่งอักขระกับหนึ่งอ็อกเท็ต RFC2130อธิบายถึงประวัตินี้อีกเล็กน้อย

โดยทั่วไป "charset" เป็นคำที่นิยมมากขึ้นเมื่อมาตรฐานเหล่านั้นถูกเขียนมันสั้นกว่า "การเข้ารหัสอักขระ" หรือ "รูปแบบการเข้ารหัสข้อความ" และคลุมเครือน้อยกว่า "การเข้ารหัส"


ดูเหมือนว่าพารามิเตอร์ 'charset' มีอยู่แล้วในRFC 1341 (มิถุนายน 1992)
John Bartholomew

1

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

การเข้ารหัสการถ่ายโอนอธิบายวิธีการถ่ายโอนข้อความและโดยทั่วไปไม่ขึ้นอยู่กับการเข้ารหัสอักขระ การเข้ารหัสการถ่ายโอนส่วนใหญ่ไม่โปร่งใสและแก้ไขลำดับไบต์ที่ถ่ายโอน การเข้ารหัสการถ่ายโอน 8 บิตนั้นโปร่งใสสำหรับการเข้ารหัส 8 บิต การเข้ารหัสการถ่ายโอน 7 บิตสามารถถ่ายโอนชุดอักขระ 7 บิตเช่น ASCII เท่านั้น

ASCII ใช้อักขระที่พิมพ์ได้ 95 ตัวและอีกสองสามอักขระสำหรับการควบคุมแคร่ (ป้อนบรรทัด, ป้อนฟอร์ม, ปัดแคร่, ย้อนกลับและแท็บ) เข้ารหัสใน 7 บิต มีอักขระควบคุมเพิ่มเติมโดยใช้ค่าที่เหลืออยู่ ASCII เป็นเซตย่อยที่เหมาะสมของชุดอักขระ UCS เช่นเดียวกับชุดอักขระ 8 บิตจำนวนมาก ISO-8859-1 เป็นชุดย่อยที่เหมาะสมของชุดอักขระ UCS แต่อักขระเหล่านี้มีการเข้ารหัสที่แตกต่างกันใน UTF-8 ซึ่งใช้หลายไบต์สำหรับค่าอักขระที่มากกว่า 127

IBM mainframes ใช้ (d) EBCDID ซึ่งใช้การเข้ารหัส 8 บิตที่แตกต่างกัน มีตารางการแปลซึ่งจับคู่อักขระที่พิมพ์ได้ระหว่างการเข้ารหัสอักขระ ASCII และ ECBDIC ECBDIC มีชุดอักขระที่ใหญ่กว่า ASCII เนื่องจากมีเครื่องหมายวรรคตอนที่ไม่พร้อมใช้งานใน ASCII สิ่งนี้อาจป้องกันการแปลงแบบไปกลับระหว่างการเข้ารหัสทั้งสองแบบนี้หากการเข้ารหัสเริ่มต้นคือ ECBDIC

การเข้ารหัสเหล่านี้ไม่เพียงพอสำหรับภาษาที่มีอักขระที่ไม่ครอบคลุมโดยอักขระที่พิมพ์ได้ของ ASCII Microsoft และอื่น ๆ ใช้ส่วนขยาย 8 บิตในชุดอักขระ ASCII และเข้ารหัสอักขระเพิ่มเติมด้วยค่าที่สูงกว่า 127 ส่วนขยายเดียวไม่เพียงพอสำหรับทุกภาษาเนื่องจากส่วนขยายเหล่านี้เพิ่มได้ไม่เกิน 96 อักขระในชุดอักขระ สิ่งนี้ส่งผลให้มีการใช้ชุดอักขระหลายชุด (ชุดอักขระ) สำหรับภาษาต่าง ๆ ที่มีการเข้ารหัสอักขระ 8 บิตแตกต่างกัน ชุดอักขระเหล่านี้รวมถึงอักขระที่จำเป็นสำหรับภาษาหรือตระกูลภาษานั้น อักขระเพิ่มเติมอาจถูกเข้ารหัสเป็นค่าที่ต่างกันในชุดอักขระที่แตกต่างกัน ผู้ใช้ภาษาอังกฤษส่วนใหญ่มีแนวโน้มที่จะสังเกตเห็นสิ่งนี้ด้วยเครื่องหมายวรรคตอนเพิ่มเติม (เครื่องหมายคำพูดซ้ายและขวาและขีดกลาง) ซึ่งแสดงอย่างไม่ถูกต้องหากใช้ชุดอักขระที่ไม่ถูกต้อง

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


0

FWIW, IIRC, ย้อนกลับไปใน Commodore 64 วัน, ชุดอักขระเป็นฟังก์ชันจาก {0, ... 255} ไปยังชุดของภาพขาวดำ uxv ทั้งหมดที่ u และ v อาจเป็น 8 และ 12 ดังนั้น "การเปลี่ยนของคุณ ชุดอักขระ "หมายถึงการใช้คำสั่ง POKE ในภาษา BASIC เพื่อแก้ไขตำแหน่งหน่วยความจำที่กำหนดเพื่อเก็บภาพเหล่านั้น ตัวอย่างเช่นรหัส ASCII 65 หมายถึง A และภาพของ A จะถูกเก็บไว้โดยเริ่มจากที่อยู่หน่วยความจำ a * 65 + b สำหรับบางขและฉันเดาว่า = u * v

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