รหัส ASCII เป็น 7 บิตหรือ 8 บิต?


104

ครูของฉันบอกว่า ASCII เป็นรูปแบบการเข้ารหัสอักขระ 8 บิต แต่กำหนดไว้สำหรับรหัส 0-127 เท่านั้นซึ่งหมายความว่าสามารถใส่เป็น 7 บิตได้ ดังนั้นจึงไม่สามารถโต้แย้งได้ว่า ASCII bit เป็นรหัส 7 บิตจริงหรือ?

และเราหมายถึงอะไรเมื่อพูดว่า ASCII เป็นรหัส 8 บิตเลย?

คำตอบ:


96

เดิมทีASCIIถูกสร้างขึ้นมาเป็นรหัส 7 บิต สิ่งนี้ทำได้ดีก่อนที่ไบต์ 8 บิตจะแพร่หลายและกระทั่งในปี 1990 คุณจะพบซอฟต์แวร์ที่คิดว่าสามารถใช้บิตที่ 8 ของข้อความแต่ละไบต์เพื่อจุดประสงค์ของมันเอง ("ไม่ใช่ 8 บิตที่สะอาด") ปัจจุบันคนคิดว่ามันเป็น 8 บิตการเข้ารหัสที่ไบต์ 0x80 ผ่าน 0xFF ไม่มีกำหนดความหมาย แต่ที่retcon

มีการเข้ารหัสข้อความมากมายที่ใช้ประโยชน์จากบิตที่ 8 สามารถจำแนกได้ว่าเข้ากันได้กับ ASCII หรือไม่และความกว้างคงที่หรือตัวแปร เข้ากันได้กับ ASCII หมายความว่าโดยไม่คำนึงถึงบริบทไบต์เดี่ยวที่มีค่าตั้งแต่ 0x00 ถึง 0x7F จะเข้ารหัสอักขระเดียวกันกับที่ทำใน ASCII คุณไม่ต้องการมีส่วนเกี่ยวข้องกับการเข้ารหัสข้อความที่ไม่เข้ากันได้กับ ASCII หากคุณสามารถหลีกเลี่ยงได้ โปรแกรมไร้เดียงสาที่คาดหวัง ASCII มักจะตีความผิดไปในทางหายนะซึ่งมักจะทำลายความปลอดภัย พวกเขาจะเลิกดังนั้นในปัจจุบันว่า (ตัวอย่างเช่น) HTML5 ห้ามการใช้งานของพวกเขาในเว็บสาธารณะมีข้อยกเว้นที่โชคร้ายของUTF-16 ฉันจะไม่พูดถึงพวกเขาอีกแล้ว

การเข้ารหัสความกว้างคงที่หมายถึงสิ่งที่ดูเหมือน: อักขระทั้งหมดถูกเข้ารหัสโดยใช้จำนวนไบต์เท่ากัน เพื่อให้เข้ากันได้กับ ASCII การเข้ารหัสแบบคงที่ต้องเข้ารหัสอักขระทั้งหมดโดยใช้เพียงไบต์เดียวดังนั้นจึงมีอักขระได้ไม่เกิน 256 ตัว ส่วนใหญ่ที่พบบ่อยเช่นการเข้ารหัสในปัจจุบันเป็นของ Windows 1252 , เป็นส่วนหนึ่งของมาตรฐาน ISO 8859-1

ปัจจุบันมีการเข้ารหัสที่เข้ากันได้กับ ASCII ที่มีความกว้างตัวแปรเดียวเท่านั้น แต่สิ่งที่สำคัญมากคือUTF-8ซึ่งรวม Unicode ทั้งหมดไว้ในการเข้ารหัสที่เข้ากันได้กับ ASCII คุณต้องการใช้สิ่งนี้จริงๆถ้าคุณสามารถจัดการได้

ในท้ายที่สุด "ASCII" ในปัจจุบันใช้คำจำกัดความที่ใช้งานได้จริงจาก Unicode ไม่ใช่มาตรฐานดั้งเดิม (ANSI X3.4-1968) เนื่องจากในอดีตมีรูปแบบต่างๆมากมายในตัวละคร ASCII 127 อักขระตัวอย่างเช่นบางส่วนของ เครื่องหมายวรรคตอนอาจถูกแทนที่ด้วยตัวอักษรเน้นเสียงเพื่ออำนวยความสะดวกในการส่งข้อความภาษาฝรั่งเศส ปัจจุบันรูปแบบเหล่านั้นล้าสมัยและเมื่อมีคนพูดว่า "ASCII" หมายความว่าไบต์ที่มีค่า 0x00 ถึง 0x7F เข้ารหัส Unicode codepoints U + 0000 ผ่าน U + 007F สิ่งนี้อาจสำคัญสำหรับคุณหากคุณเคยพบว่าตัวเองกำลังเขียนมาตรฐานทางเทคนิค

หากคุณสนใจประวัติของ ASCII และการเข้ารหัสที่อยู่ก่อนหน้านั้นให้เริ่มด้วยกระดาษ "The Evolution of Character Codes, 1874-1968" (สำเนา samizdat ที่http://falsedoor.com/doc/ascii_evolution-of- character -code.pdf ) จากนั้นไล่ตามข้อมูลอ้างอิง (ซึ่งส่วนใหญ่ไม่มีให้บริการทางออนไลน์และอาจหายากแม้จะเข้าใช้ห้องสมุดมหาวิทยาลัยก็ตามฉันเสียใจที่จะพูด)


1
ASCII ทุกวันนี้เป็น 7 บิตหรือ 8 บิตหรือไม่? คุณบอกว่ามันใช้ 0x00-0x7F ตอนนี้ชัด ๆ แต่เรานับ 0 นำหน้าไหม?
Anurag Kalia

8
ขึ้นอยู่กับว่าคุณเป็นคนอวดรู้แบบไหน ข้อกำหนดที่ยังคงกำหนด ASCII อย่างเป็นทางการ (ANSI X3.4-1968) อธิบายว่าเป็นการเข้ารหัสแบบ 7 บิต แต่ไม่มีใครส่งไบต์ 7 บิตอีกต่อไปและความสามารถในการทำงานร่วมกันในปัจจุบันกำหนดว่าบิตที่แปดต้องเป็นศูนย์ - คุณทำไม่ได้ ใช้สำหรับบิตพาริตีหรือคล้ายกัน ดังนั้น IMNSHO จึงถูกต้องเท่าเทียมกันในการอธิบาย ASCII ว่าเป็นการเข้ารหัสแบบแปดบิตโดยปล่อยให้ครึ่งบนของช่องว่างเป็น "สงวนไว้ห้ามใช้" ไม่ว่าจะด้วยวิธีใดก็ตามหากคุณส่งแปดบิตไบต์ใด ๆ ที่มีการตั้งค่าบิตสูงคุณจะไม่ส่ง ASCII ที่ถูกต้อง
zwol

1
(... แต่คุณอาจส่งสิ่งอื่นที่ถูกต้องเช่น UTF-8 หรือ ISO 8859-1 หรือ KOI8-R)
zwol

1
มาตรฐานคือ INCITS 4-1986 [R2012] เนื่องจาก ASC เดิมเรียกว่า X3 กลายพันธุ์เป็น NCITS จากนั้น INCITS แต่ตัวแปร 7 บิตที่มีตัวอักษรเน้นเสียงประมาณโหลสำหรับฝรั่งเศสเยอรมันสเปน ฯลฯ ไม่ใช่ ANSI / INCITS แต่เป็นISO / IEC 646และ ECMA-6 และเป็น 8 บิต (ISO / IEC) 8859-1 ที่สร้างบล็อก 256-char แรกของ Unicode
dave_thompson_085

2
@ dave_thompson_085 ไม่ใช่ทุกคนที่อวดรู้เหมือนคุณ - ซึ่งหมายความว่าคุณสามารถค้นหาเอกสารทางเทคนิคที่เก่ากว่าและแม้แต่มาตรฐานที่อ้างอิง "ASCII" หรือแม้แต่ "X3.4-1968" โดยตั้งใจที่จะรวมตัวแปรประจำชาติหรืออย่างน้อยที่สุด ไม่ได้ตัดสินอย่างชัดเจนนำไปสู่การโต้แย้ง ดังนั้นโดยส่วนตัวแล้วฉันจะใช้ Unicode เป็นตัวอ้างอิงเชิงบรรทัดฐานสำหรับ ASCII หากฉันต้องเขียนข้อมูลจำเพาะที่มีความสำคัญ นั่นคือทั้งหมดที่ฉันหมายถึง
zwol

15

บน Linux man asciiพูดว่า:

ASCII คือรหัสมาตรฐานของอเมริกาสำหรับการแลกเปลี่ยนข้อมูล เป็นรหัส 7 บิต


10

ตาราง ASCII ดั้งเดิมถูกเข้ารหัสเป็น7 บิตดังนั้นจึงมีอักขระ 128 ตัว

ปัจจุบันผู้อ่าน / บรรณาธิการส่วนใหญ่ใช้ตาราง ASCII แบบ "ขยาย" (จากISO 8859-1 ) ซึ่งเข้ารหัสเป็น8 บิตและมีอักขระ 256 ตัว (รวมถึงÁ , Ä , Œ , é , èและอักขระอื่น ๆ ที่มีประโยชน์สำหรับภาษายุโรปด้วย เป็นร่ายมนตร์ทางคณิตศาสตร์และสัญลักษณ์อื่น ๆ )

ในขณะที่ UTF-8 ใช้การเข้ารหัสเช่นเดียวกับตาราง ASCII ขั้นพื้นฐาน (ความหมาย0x41คือในรหัสทั้งสอง) ก็ไม่ได้แบ่งปันการเข้ารหัสที่เหมือนกันสำหรับ "ขยาย-A ละติน" บล็อก ซึ่งบางครั้งทำให้เกิดตัวละครแปลกที่จะปรากฏในคำเช่นอาหารตามสั่งหรือPiñata


มีข้อผิดพลาดหลายประการในข้างต้น Œไม่ได้เป็นส่วนหนึ่งของมาตรฐาน ISO 8859-1 แม้ว่ามันจะอยู่ในCP-1252 และบล็อกLatin Extended-Aไม่ใช่อักขระ 128 หรือ 256 ตัวแรกของ Unicode แต่เป็นบล็อกถัดไปหลังจากที่มีตัวอักษรเช่นğ, łและ ſ
Richard Smith

จุดดี! ฉันคิดว่าฉันหมายถึง "อาหารเสริมละติน -1" มาตรฐานทั่วไป ...
Guillaume

1
มีชุดอักขระ "Extended ASCII" จำนวนมากและมีเพียงชุดเดียวคือ ISO 8859-1 คำนี้แทบไม่มีความหมายเลยเพราะเมื่อคุณเข้ารหัสและถอดรหัสข้อความคุณต้องรู้ว่ากำลังใช้การเข้ารหัสอักขระใด (และอาจไม่ได้ใช้กับชุดอักขระ Extended ASCII)
Tom Blodget

3

การเข้ารหัส ASCII คือ 7 บิต แต่ในทางปฏิบัติอักขระที่เข้ารหัสใน ASCII จะไม่ถูกเก็บไว้ในกลุ่ม 7 บิต แต่ ASCII หนึ่งรายการจะถูกเก็บไว้ในไบต์โดยปกติ MSB จะตั้งค่าเป็น 0 (ใช่มันเสียใน ASCII)

คุณสามารถตรวจสอบสิ่งนี้ได้โดยป้อนสตริงในชุดอักขระ ASCII ในโปรแกรมแก้ไขข้อความตั้งค่าการเข้ารหัสเป็น ASCII และดูไบนารี / ฐานสิบหก:
ป้อนคำอธิบายภาพที่นี่

นอกเหนือจากนี้: การใช้การเข้ารหัส ASCII (อย่างเคร่งครัด) ถือเป็นเรื่องผิดปกติในความนิยมของ UTF-8 (ซึ่งไม่เสีย MSB ที่กล่าวถึงข้างต้น - ในความเป็นจริง MSB 1 ระบุว่าจุดรหัสถูกเข้ารหัสด้วยมากกว่า 1 ไบต์)


0

รหัส ASCII ดั้งเดิมมีอักขระที่แตกต่างกัน 128 อักขระที่มีหมายเลข 0 ถึง 127 ASCII 7 บิตมีความหมายเหมือนกันเนื่องจากไบต์ 8 บิตเป็นองค์ประกอบหน่วยเก็บข้อมูลทั่วไป ASCII จึงเว้นที่ว่างสำหรับอักขระเพิ่มเติม 128 ตัวซึ่งใช้สำหรับภาษาต่างประเทศและสัญลักษณ์อื่น ๆ แต่รหัส 7 บิตเป็นต้นฉบับที่สร้างขึ้นก่อนรหัส 8 บิต ASCII ย่อมาจาก American Standard Code for Information Interchange ในระบบอินเทอร์เน็ตเมลยุคแรกรองรับเฉพาะรหัส ASCII 7 บิตเท่านั้นเนื่องจากสามารถรันโปรแกรมและไฟล์มัลติมีเดียผ่านระบบดูดได้ ระบบเหล่านี้ใช้ 8 บิตของไบต์ แต่จากนั้นจะต้องเปลี่ยนเป็นรูปแบบ 7 บิตโดยใช้วิธีการเข้ารหัสเช่น MIME, UUcoding และ BinHex ซึ่งหมายความว่า 8 บิตถูกแปลงเป็นอักขระ 7 บิตซึ่งจะเพิ่มไบต์พิเศษเพื่อเข้ารหัส


-4

เมื่อเราเรียก ASCII เป็นรหัส 7 บิตบิตส่วนใหญ่ทางซ้ายจะถูกใช้เป็นบิตเครื่องหมายดังนั้นด้วย 7 บิตเราสามารถเขียนได้ถึง 127 ซึ่งหมายถึงจาก -126 ถึง 127 เนื่องจากค่าอิหม่ามสูงสุดของ ASCII คือ 0 ถึง 255 ซึ่งอาจเป็นได้ พอใจกับอาร์กิวเมนต์ 7 บิตเท่านั้นหากบิตสุดท้ายถือเป็นบิตเครื่องหมาย


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