Unicode และ ASCII ต่างกันอย่างไร?
ASCII มีอักขระทั้งหมด 128 ตัว (256 ในชุดเพิ่มเติม)
มีข้อกำหนดขนาดสำหรับอักขระ Unicode หรือไม่
Unicode และ ASCII ต่างกันอย่างไร?
ASCII มีอักขระทั้งหมด 128 ตัว (256 ในชุดเพิ่มเติม)
มีข้อกำหนดขนาดสำหรับอักขระ Unicode หรือไม่
คำตอบ:
ASCII กำหนด 128 อักขระซึ่งแมปกับหมายเลข 0–127 Unicode กำหนด (น้อยกว่า) 2 21ตัวอักษรซึ่งในทำนองเดียวกันแมปไปที่หมายเลข 0-2 21 (แม้ว่าจะไม่ได้กำหนดจำนวนทั้งหมดในขณะนี้และบางตัวสงวนไว้)
Unicode เป็นชุดของ ASCII และตัวเลข 0–127 มีความหมายเหมือนกันใน ASCII เหมือนกับที่มีใน Unicode ตัวอย่างเช่นหมายเลข 65 หมายถึง "ละตินทุน 'A'"
เนื่องจากโดยทั่วไปอักขระ Unicode ไม่พอดีกับหนึ่งไบต์ 8 บิตมีวิธีการเก็บอักขระ Unicode มากมายในลำดับไบต์เช่น UTF-32 และ UTF-8
การเข้าใจว่าทำไม ASCII และ Unicode จึงถูกสร้างขึ้นตั้งแต่แรกช่วยให้ฉันเข้าใจความแตกต่างระหว่างทั้งสอง
ASCII, Origins
ตามที่ระบุไว้ในคำตอบอื่น ๆ ASCII ใช้ 7 บิตเพื่อเป็นตัวแทนของตัวละคร โดยใช้ 7 บิตเราสามารถมีได้สูงสุด 2 ^ 7 (= 128) ชุดที่แตกต่างกัน* ซึ่งหมายความว่าเราสามารถแสดงได้สูงสุด 128 ตัวอักษร
เดี๋ยวก่อน 7 บิต? แต่ทำไมไม่ 1 ไบต์ (8 บิต)
บิตสุดท้าย (8) ถูกนำมาใช้เพื่อหลีกเลี่ยงข้อผิดพลาดเป็นบิตพาริตี นี่เป็นปีที่เกี่ยวข้องกันมาแล้ว
อักขระ ASCII ส่วนใหญ่เป็นอักขระที่พิมพ์ได้ของตัวอักษรเช่น abc, ABC, 123,? &! ฯลฯ อื่น ๆ เป็นอักขระควบคุมเช่นการขึ้นบรรทัดใหม่ , การป้อนบรรทัด , แท็บ ฯลฯ
ดูด้านล่างเป็นตัวแทนไบนารีของตัวละครไม่กี่ตัวใน ASCII:
0100101 -> % (Percent Sign - 37)
1000001 -> A (Capital letter A - 65)
1000010 -> B (Capital letter B - 66)
1000011 -> C (Capital letter C - 67)
0001101 -> Carriage Return (13)
ดูตาราง ASCII เต็มมากกว่าที่นี่
ASCII มีไว้สำหรับภาษาอังกฤษเท่านั้น
อะไร? ทำไมต้องเป็นภาษาอังกฤษเท่านั้น? มีภาษามากมายให้ออกไปที่นั่น!
เนื่องจากศูนย์กลางของอุตสาหกรรมคอมพิวเตอร์อยู่ในสหรัฐอเมริกาในขณะนั้น ดังนั้นพวกเขาไม่จำเป็นต้องสนับสนุนการเน้นเสียงหรือเครื่องหมายอื่น ๆ เช่นá, ü, ç, ñ, ฯลฯ (อาคากำกับออกเสียง )
ASCII เพิ่มเติม
คนฉลาดบางคนเริ่มใช้บิตที่ 8 (บิตที่ใช้สำหรับพาริตี้) เพื่อเข้ารหัสอักขระเพิ่มเติมเพื่อสนับสนุนภาษาของพวกเขา (เพื่อสนับสนุน "é" ในภาษาฝรั่งเศสเป็นต้น) เพียงแค่เพิ่มขนาดบิตหนึ่งเท่าของตาราง ASCII ดั้งเดิมสองเท่าเพื่อแมปได้ถึง 256 อักขระ (2 ^ 8 = 256 ตัวอักษร) และไม่ใช่ 2 ^ 7 เหมือนก่อนหน้า (128)
10000010 -> é (e with acute accent - 130)
10100000 -> á (a with acute accent - 160)
ชื่อของ "ASCII นี้ถูกขยายเป็น 8 บิตและไม่ใช่ 7 บิตเหมือนก่อน" อาจเรียกได้ว่าเป็น "Extended ASCII" หรือ "8-bit ASCII"
ในฐานะที่เป็น@ Tomชี้ให้เห็นในความคิดเห็นของเขาด้านล่างไม่มีสิ่งเช่น " ขยาย ASCII " ยังเป็นวิธีที่ง่ายในการอ้างถึงเคล็ดลับ 8 บิตนี้ มีหลายรูปแบบของตาราง ASCII 8 บิตเป็นเช่นISO 8859-1 หรือที่เรียกว่า ISO Latin-1
Unicode, Rise
ASCII Extended แก้ปัญหาสำหรับภาษาที่ใช้ตัวอักษรละติน ... แล้วคนอื่น ๆ ที่ต้องการตัวอักษรที่แตกต่างอย่างสิ้นเชิงล่ะ? กรีก? รัสเซีย? จีนและชอบ?
เราต้องการชุดอักขระใหม่ทั้งหมด ... นั่นคือเหตุผลเบื้องหลัง Unicode Unicode ไม่ได้มีตัวละครทุกตัวจากทุกภาษา แต่แน่นอนว่ามีตัวอักษรจำนวนมหาศาล ( ดูตารางนี้ )
คุณไม่สามารถบันทึกข้อความในฮาร์ดไดรฟ์ของคุณเป็น "Unicode" Unicode เป็นการแสดงนามธรรมของข้อความ คุณต้อง "เข้ารหัส" การแสดงนามธรรมนี้ นั่นคือกรณีที่การเข้ารหัสมาลงเล่น
การเข้ารหัส: UTF-8 กับ UTF-16 กับ UTF-32
คำตอบนี้ทำได้ค่อนข้างดีเมื่ออธิบายพื้นฐาน:
UTF-8 ใช้ชุด ASCII สำหรับอักขระ 128 ตัวแรก มีประโยชน์เพราะมันหมายความว่าข้อความ ASCII นั้นใช้ได้ใน UTF-8
จำ:
บันทึก:
ทำไมต้อง 2 ^ 7
ชัดเจนสำหรับบางคน แต่ในกรณีนี้ เรามีช่องเจ็ดช่องที่เติมเต็มด้วย 0 หรือ 1 ( รหัสไบนารี ) แต่ละคนสามารถมีสองชุด หากเรามีเจ็ดจุดเรามี 2 * 2 * 2 * 2 * 2 * 2 * 2 = 2 ^ 7 = 128 ชุดค่าผสม คิดว่าเรื่องนี้เป็นล็อคการรวมกันที่มีเจ็ดล้อแต่ละล้อมีตัวเลขสองตัวเท่านั้น
แหล่งที่มา: Wikipedia , บล็อกโพสต์ที่ยอดเยี่ยมนี้และMockiที่ฉันโพสต์สรุปครั้งแรก
ASCII มีรหัสจุด 128, 0 ถึง 127 มันสามารถใส่ใน 8 บิตเดียวไบต์ค่า 128 ถึง 255 มักจะใช้สำหรับอักขระอื่น ด้วยตัวเลือกที่เข้ากันไม่ได้ทำให้เกิดภัยพิบัติหน้ารหัส ข้อความที่เข้ารหัสในโค้ดเพจหนึ่งไม่สามารถอ่านได้อย่างถูกต้องโดยโปรแกรมที่ถือว่าหรือเดาที่โค้ดเพจอื่น
ยูนิโค้ดมาเพื่อแก้ไขหายนะนี้ เวอร์ชัน 1 เริ่มต้นด้วยคะแนนรหัส 65536 รหัสซึ่งเข้ารหัสโดยทั่วไปใน 16 บิต ต่อมาขยายในเวอร์ชัน 2 ถึง 1.1 ล้านจุดรหัส รุ่นปัจจุบันคือ 6.3 โดยใช้ 110,187 จาก 1.1 ล้านคะแนนรหัส ไม่พอดีกับ 16 บิตอีกต่อไป
การเข้ารหัสในรูปแบบ 16 บิตนั้นเป็นเรื่องปกติเมื่อ v2 เข้ามาใช้โดยระบบปฏิบัติการ Microsoft และ Apple เป็นต้น และภาษา runtimes เช่น Java ข้อมูลจำเพาะ v2 เกิดขึ้นพร้อมกับวิธีการจับคู่รหัสคะแนน 1.1 ล้านเข้าไปใน 16- บิต การเข้ารหัสที่เรียกว่า UTF-16 การเข้ารหัสความยาวผันแปรได้ที่จุดโค้ดหนึ่งจุดสามารถใช้เวลา 2 หรือ 4 ไบต์ คะแนน v1 รหัสต้นฉบับใช้เวลา 2 ไบต์และเพิ่มอีก 4 คะแนน
การเข้ารหัสความยาวตัวแปรอีกตัวที่ใช้กันทั่วไปในระบบปฏิบัติการและเครื่องมือ * nix คือ UTF-8 จุดโค้ดสามารถใช้ระหว่าง 1 ถึง 4 ไบต์รหัส ASCII ดั้งเดิมใช้เวลา 1 ไบต์ส่วนที่เหลือจะมีมากขึ้น การเข้ารหัสความยาวที่ไม่ใช่ตัวแปรเพียงอย่างเดียวคือ UTF-32 ใช้เวลา 4 ไบต์สำหรับจุดโค้ด ไม่ได้ใช้บ่อยเพราะมันสิ้นเปลืองสวย มีคนอื่น ๆ เช่น UTF-1 และ UTF-7 ถูกละเว้นอย่างกว้างขวาง
ปัญหาเกี่ยวกับการเข้ารหัส UTF-16/32 คือลำดับของไบต์จะขึ้นอยู่กับ endian-ness ของเครื่องที่สร้างกระแสข้อความ ดังนั้นเพิ่มการผสม UTF-16BE, UTF-16LE, UTF-32BE และ UTF-32LE
การมีตัวเลือกการเข้ารหัสที่แตกต่างกันเหล่านี้จะนำหายนะกลับมาของโค้ดในระดับหนึ่งพร้อมกับการโต้วาทีอย่างร้อนแรงในหมู่โปรแกรมเมอร์ซึ่งตัวเลือก UTF นั้น "ดีที่สุด" ความสัมพันธ์ของพวกเขากับค่าเริ่มต้นของระบบปฏิบัติการค่อนข้างดึงดูดเส้น การวัดผลหนึ่งคือคำจำกัดความของ BOM เครื่องหมายคำสั่งซื้อ Byte Codepoint พิเศษ (U + FEFF พื้นที่กว้างเป็นศูนย์) ที่จุดเริ่มต้นของสตรีมข้อความที่ระบุวิธีการเข้ารหัสสตรีมที่เหลือ มันบ่งชี้ว่าการเข้ารหัส UTF และ endianess และเป็นกลางกับเอ็นจิ้นการเรนเดอร์ข้อความ น่าเสียดายที่มันเป็นทางเลือกและโปรแกรมเมอร์หลายคนอ้างสิทธิ์ในการละเว้นมันดังนั้นอุบัติเหตุจึงยังเป็นเรื่องปกติ
java ให้การสนับสนุน Unicode เช่นมันรองรับตัวอักษรทั่วโลกทั้งหมด ดังนั้นขนาดของ char ใน java คือ 2 ไบต์ และช่วงคือ 0 ถึง 65535
ASCII มีตำแหน่งรหัส 128 ซึ่งจัดสรรให้กับอักขระกราฟิกและอักขระควบคุม (รหัสควบคุม)
Unicode มีตำแหน่งรหัส 1,114,112 ตำแหน่ง ขณะนี้มีประมาณ 100,000 คนถูกจัดสรรให้กับตัวอักษรและจุดรหัสจำนวนมากได้ถูกทำขึ้นอย่างถาวรโดยไม่มีตัวอักษร (เช่นไม่เคยเข้ารหัสตัวอักษรใด ๆ เลย) และจุดรหัสส่วนใหญ่ยังไม่ได้รับมอบหมาย
สิ่งเดียวที่ ASCII และ Unicode มีเหมือนกันคือ: 1) เป็นรหัสอักขระ 2) ตำแหน่งโค้ดแรก 128 ของ Unicode ได้รับการกำหนดให้มีความหมายเช่นเดียวกับใน ASCII ยกเว้นว่าตำแหน่งโค้ดของอักขระควบคุม ASCII นั้นเพิ่งถูกกำหนดเป็น denoting อักขระควบคุมด้วยชื่อที่สอดคล้องกับชื่อ ASCII ของพวกเขา แต่ความหมายของมันคือ ไม่ได้กำหนดไว้ใน Unicode
อย่างไรก็ตามบางครั้ง Unicode นั้นมีลักษณะเฉพาะ (แม้จะอยู่ในมาตรฐาน Unicode!) ในฐานะ "wide ASCII" นี่เป็นสโลแกนที่ส่วนใหญ่พยายามถ่ายทอดความคิดที่ว่า Unicode นั้นหมายถึงเป็นรหัสอักขระสากลเช่นเดียวกับ ASCII ครั้งเดียว (แม้ว่าตัวละครของ ASCII นั้นไม่เพียงพอสำหรับการใช้ทั่วไปอย่างสิ้นหวัง) ตรงกันข้ามกับการใช้รหัสที่แตกต่างกัน ระบบและแอพพลิเคชั่นที่แตกต่างกันและสำหรับภาษาที่ต่างกัน
Unicode ดังกล่าวจะกำหนดเฉพาะ“ ขนาดตรรกะ” ของตัวละคร: ตัวละครแต่ละตัวมีหมายเลขรหัสในช่วงที่ระบุ หมายเลขรหัสเหล่านี้สามารถนำเสนอโดยใช้การเข้ารหัสการถ่ายโอนที่แตกต่างกันและภายในหน่วยความจำอักขระ Unicode มักจะแสดงโดยใช้ปริมาณหนึ่งหรือสอง 16 บิตต่ออักขระขึ้นอยู่กับช่วงอักขระบางครั้งใช้ปริมาณ 32 บิตต่ออักขระ
ASCII และ Unicode เป็นการเข้ารหัสอักขระสองตัว โดยพื้นฐานแล้วเป็นมาตรฐานในการแสดงอักขระที่แตกต่างในไบนารีเพื่อให้สามารถเขียนจัดเก็บส่งและอ่านในสื่อดิจิทัล ความแตกต่างที่สำคัญระหว่างสองคือวิธีที่พวกเขาเข้ารหัสอักขระและจำนวนบิตที่พวกเขาใช้สำหรับแต่ละ ASCII เดิมใช้เจ็ดบิตเพื่อเข้ารหัสอักขระแต่ละตัว ต่อมาเพิ่มเป็นแปดด้วย Extended ASCII เพื่อแก้ไขปัญหาความไม่ชัดเจนของต้นฉบับ ในทางตรงกันข้าม Unicode ใช้โปรแกรมเข้ารหัสบิตตัวแปรซึ่งคุณสามารถเลือกได้ระหว่างการเข้ารหัส 32, 16 และ 8 บิต การใช้บิตเพิ่มเติมช่วยให้คุณสามารถใช้อักขระมากขึ้นโดยเสียค่าใช้จ่ายของไฟล์ที่มีขนาดใหญ่ขึ้นในขณะที่บิตที่น้อยลงจะทำให้คุณมีทางเลือก จำกัด ใช้จำนวนบิตน้อยลง (เช่น
หนึ่งในสาเหตุหลักที่ทำให้ Unicode เป็นปัญหาเกิดขึ้นจากหลาย ๆ โปรแกรมที่ไม่ได้มาตรฐานของ ASCII นอกจากว่าคุณกำลังใช้เพจที่แพร่หลายซึ่ง Microsoft และ บริษัท ซอฟต์แวร์อื่น ๆ ส่วนใหญ่ใช้อยู่ดังนั้นคุณมีแนวโน้มที่จะประสบปัญหากับตัวละครของคุณที่ปรากฏเป็นกล่อง Unicode กำจัดปัญหานี้ได้อย่างแท้จริงเนื่องจากจุดรหัสอักขระทั้งหมดเป็นมาตรฐาน
ข้อได้เปรียบที่สำคัญอีกอย่างของ Unicode ก็คือมันสามารถรองรับจำนวนอักขระได้สูงสุด ด้วยเหตุนี้ยูนิโค้ดจึงมีภาษาที่เขียนมากที่สุดและยังมีที่ว่างมากขึ้น ซึ่งรวมถึงสคริปต์จากซ้ายไปขวาทั่วไปเช่นอังกฤษและแม้แต่สคริปต์จากขวาไปซ้ายเช่นอาหรับ จีนญี่ปุ่นและตัวแปรอื่น ๆ อีกมากมายยังมีอยู่ใน Unicode ดังนั้น Unicode จะไม่ถูกแทนที่ในเร็ว ๆ นี้
เพื่อรักษาความเข้ากันได้กับ ASCII รุ่นเก่าซึ่งใช้กันอย่างแพร่หลายในเวลานั้น Unicode ได้รับการออกแบบในลักษณะที่แปดบิตแรกตรงกับหน้า ASCII ที่นิยมมากที่สุด ดังนั้นหากคุณเปิดไฟล์ที่เข้ารหัส ASCII ด้วย Unicode คุณยังคงได้รับอักขระที่ถูกเข้ารหัสในไฟล์ สิ่งนี้อำนวยความสะดวกในการยอมรับ Unicode เนื่องจากจะลดผลกระทบของการใช้มาตรฐานการเข้ารหัสใหม่สำหรับผู้ที่ใช้ ASCII อยู่แล้ว
สรุป:
1.ASCII uses an 8-bit encoding while Unicode uses a variable bit encoding.
2.Unicode is standardized while ASCII isn’t.
3.Unicode represents most written languages in the world while ASCII does not.
4.ASCII has its equivalent within Unicode.
ตัวเลขที่กำหนดมีไว้สำหรับการจัดเก็บ 1 ตัวเท่านั้น
ASCII กำหนด 128 อักขระเนื่องจาก Unicode มีเพลงมากกว่า 120,000 ตัว
นอกเหนือจากที่ UTF เป็นชุดของ ASCII แล้วความแตกต่างที่ดีอีกประการหนึ่งที่ควรทราบระหว่าง ASCII และ UTF คือการเข้ารหัสไฟล์ดิสก์และการแสดงข้อมูลและการจัดเก็บในหน่วยความจำแบบสุ่ม โปรแกรมรู้ว่าข้อมูลที่ให้ควรเป็นสตริง ASCII หรือ UTF โดยการตรวจจับโค้ดเครื่องหมายคำสั่งไบต์พิเศษที่จุดเริ่มต้นของข้อมูลหรือโดยสมมติจากเจตนาของโปรแกรมเมอร์ว่าข้อมูลเป็นข้อความจากนั้นตรวจสอบรูปแบบที่ระบุว่าเป็น ในการเข้ารหัสข้อความหนึ่งหรืออื่น ๆ
การใช้คำนำหน้าเอกสารทั่วไปของ0x
ข้อมูลเลขฐานสิบหกอ้างอิงที่ดีพื้นฐานคือข้อความ ASCII เริ่มต้นด้วยค่าไบต์0x00
ที่จะ0x7F
เป็นตัวแทนหนึ่งในค่าอักขระ ASCII ที่เป็นไปได้ โดยปกติแล้วข้อความ UTF จะถูกระบุด้วยการเริ่มต้นด้วยไบต์0xEF 0xBB 0xBF
สำหรับ UTF8 สำหรับ UTF16 ให้เริ่มต้นไบต์0xFE 0xFF
หรือ0xFF 0xFE
ใช้พร้อมกับคำสั่ง endian-ness ของไบต์ข้อความที่ระบุโดยคำสั่งของไบต์เริ่มต้น สถานะที่เรียบง่ายของค่าไบต์ที่ไม่ได้อยู่ในช่วง ASCII ของค่าไบต์ที่เป็นไปได้ยังบ่งชี้ว่าข้อมูลน่าจะเป็น UTF
มีเครื่องหมายลำดับไบต์อื่น ๆที่ใช้รหัสที่แตกต่างกันเพื่อบ่งชี้ว่าข้อมูลควรถูกตีความว่าเป็นข้อความที่เข้ารหัสในมาตรฐานการเข้ารหัสที่แน่นอน