Яка різниця між ASCII та Unicode?


407

Відповіді:


534

ASCII визначає 128 символів, які позначаються на числах 0–127. Unicode визначає (менше) 2 21 символів, які аналогічно відображаються на числах 0-22 21 (хоча в даний час не всі числа присвоєні, а деякі зарезервовані).

Unicode - це набір ASCII, і цифри 0–127 мають те саме значення, що й у Unicode. Наприклад, число 65 означає "латинська столиця" А ".

Оскільки символи Unicode зазвичай не вписуються в один 8-бітний байт, існує безліч способів зберігання символів Unicode в послідовностях байтів, таких як UTF-32 і UTF-8.


4
@riderBill: Що зараз? Про які 3 біти ви говорите? У Unicode немає бітів. Просто кодові точки.
Керрек СБ

@riderBill: знову: про який "3 байти" ви зараз говорите? :-) (Нічого цього не має відношення до Unicode. Unicode стосується лише присвоєння значення числам, це не про біти та байти.)
Керрек SB

8
@riderBill: Unicode не "використовує від 1 до 4 байтів". Unicode - це присвоєння значення числам. Він не використовує жодних байт. Існують певні стандартизовані схеми кодування, які представляють кодові точки Unicode як потік байтів, але вони є ортогональними для Unicode як набір символів. (Так,
сміливо

@CleanCrispCode Unicode насправді є набором ISO-8859-1 , який сам по собі є набором ASCII. Іноді це корисно знати.
Марк Викуп

8
Для того, щоб уточнити, Unicode набір символів сам по собі є підмножиною ISO-8859-1 набір символів , але UTF-8 кодування є НЕ надмножество ISO-8859-1 кодування , але ASCII кодування .
minmaxavg

392

Розуміння, чому ASCII і Unicode створені в першу чергу, допомогло мені зрозуміти відмінності між ними.

ASCII, Походження

Як зазначено в інших відповідях, 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 Extended

Деякі розумні люди почали використовувати восьмий біт (біт, що використовується для паритету), щоб кодувати більше символів для підтримки їх мови (для підтримки "é", наприклад, французькою мовою). Просто за допомогою одного зайвого біта вдвічі збільшився розмір вихідної таблиці ASCII для відображення до 256 символів (2 ^ 8 = 256 символів). І не 2 ^ 7, як раніше (128).

10000010 -> é (e with acute accent - 130)
10100000 -> á (a with acute accent - 160)

Назва для цього "ASCII поширюється на 8 біт, а не на 7 біт, як раніше", можна просто називати "розширеним ASCII" або "8-бітним ASCII".

Як @Tom зазначив у своєму коментарі нижче, немає такого поняття, як " розширений ASCII ", але це простий спосіб посилатися на цей 8-бітний трюк. Існує багато варіацій 8-бітної таблиці ASCII, наприклад, ISO 8859-1, який також називається ISO Latin-1 .

Unicode, The Rise

ASCII Extended вирішує проблему для мов, заснованих на латинському алфавіті ... а що з іншими, які потребують зовсім іншого алфавіту? Грецька? Російський? Китайці та подібні?

Нам знадобився б абсолютно новий набір символів ... це раціонально за Unicode. Unicode не містить кожного символу з кожної мови, але він обов'язково містить гігантську кількість символів ( див. Цю таблицю ).

Ви не можете зберегти текст на жорсткому диску як "Unicode". Unicode - це абстрактне подання тексту. Вам потрібно «кодувати» це абстрактне подання. Ось тут і грає кодування .

Кодування: UTF-8 проти UTF-16 проти UTF-32

Ця відповідь робить досить непогану роботу з пояснення основ:

  • UTF-8 і UTF-16 - це кодування змінної довжини.
  • У UTF-8 символ може займати як мінімум 8 біт.
  • У UTF-16 довжина символів починається з 16 біт.
  • UTF-32 - це кодування фіксованої довжини 32 біта.

UTF-8 використовує набір ASCII для перших 128 символів. Це зручно, оскільки це означає, що текст ASCII також дійсний у UTF-8.

Мнемоніка:

  • UTF- 8 : мінімум 8 біт.
  • UTF- 16 : мінімум 16 біт.
  • UTF- 32 : мінімальний та максимум 32 біт.

Примітка:

Чому 2 ^ 7?

Для деяких це очевидно, але про всяк випадок. У нас є сім слотів, заповнених або 0, або 1 ( Бінарний код ). Кожна може мати дві комбінації. Якщо у нас сім плям, ми маємо 2 * 2 * 2 * 2 * 2 * 2 * 2 = 2 ^ 7 = 128 комбінацій. Подумайте про це як комбінований замок із семи колесами, кожне колесо має лише два числа.

Джерело: Вікіпедія , цей чудовий пост у блозі та Mocki, де я спочатку розмістив це резюме.


7
Немає тексту, а закодований текст. Деякі кодування дуже прості, особливо для наборів символів з <= 256 кодовими точками. "Розширений ASCII" - дуже неоднозначний термін; Є деякі, хто підтримує грецьку, російську та / або польську мови. ASCII недостатній для англійського тексту, який використовує á, ü, ç, ñ. Я підозрюю, що він був розроблений для підтримки комп'ютерних мов, а не людських мов. Догматично, коли ви пишете файл або потік, ви маєте набір символів і вибираєте кодування. Ваш читач повинен отримати байти та знання, яке кодування. В іншому випадку зв’язок не вдався.
Том Блоджет

Дуже дякую за додаток. Відповідно я оновив відповідь.
Андрій

Дякую. Я помічаю скрізь таблиці ASCII, коди символів відображають як 0-127, але таблиці UTF-8 показують коди як шістнадцяткові, а не цілі числа. Чи є для цього причина? Чому таблиці UTF-X не показують 0-127 / 255/65535 проти 00-AF? Це щось означає?
wayofthefuture

Дякую за відповідь. Швидке запитання: "У UTF-16 довжина символів починається з 16 біт" - Чи означає це, що буквено-цифрові символи не можуть бути представлені UTF-16, оскільки вони є лише 8-бітовими символами?
Мондра

Чудова відповідь, лише у мене одне питання - чи справді польська мова використовує інший алфавіт? Я думав, ми використовуємо той самий, що й англійський, лише з якимись додатковими літерами?
Нікофісі

89

ASCII має 128 кодових точок, від 0 до 127. Він може вміщуватися в одному 8-бітовому байті, значення 128 - 255 зазвичай використовуються для інших символів. З несумісним вибором, що спричиняє катастрофу на кодовій сторінці . Текст, закодований на одній кодовій сторінці, не може правильно прочитати програма, яка припускає чи здогадується на іншій сторінці коду.

Unicode зібрався вирішити цю катастрофу. Версія 1 розпочалася з 65536 кодових очок, які зазвичай кодуються у 16 ​​бітах. Пізніше розширено у версії 2 до 1,1 мільйона кодових пунктів. Поточна версія - 6.3, використовуючи 110 187 доступних 1,1 мільйона кодових балів. Це більше не вміщується в 16 біт.

Кодування в 16 бітах було звичайним явищем, коли з'явилася версія v2, яка використовується, наприклад, операційними системами Microsoft та Apple. І мови виконання, як 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 полягає в тому, що порядок байтів буде залежати від нестабільності машини, яка створила текстовий потік. Тому додайте до суміші UTF-16BE, UTF-16LE, UTF-32BE та UTF-32LE.

Наявність цих різних варіантів кодування до деякої міри повертає катастрофу на кодовій сторінці, а також бурхливі дебати серед програмістів, для яких вибір UTF є "найкращим". Їх зв'язок із типовими налаштуваннями операційної системи в значній мірі накреслює межі. Один зустрічний захід - це визначення BOM, позначки порядку байтів, спеціальної кодової точки (U + FEFF, пробіл нульової ширини) на початку текстового потоку, що вказує, як кодується решта потоку. Він позначає як кодування UTF, так і ендіастичність і є нейтральним до механізму візуалізації тексту. На жаль, це не є обов'язковим, і багато програмістів заявляють про своє право опускати його, тому нещасні випадки все ще досить поширені.


31

java забезпечує підтримку Unicode, тобто він підтримує всі алфавіти у всьому світі. Отже, розмір char в java - 2 байти. А діапазон - від 0 до 65535.

введіть тут опис зображення


Кейпіктура для пояснення .. Ніцца
Понмарі Субраманійський

2
Шкода, що це неправильно. "Коди ASCII (128)" було б правильним.
Марк Толонен

15

ASCII має 128 кодових позицій, виділених графічним символам та керуючим символам (контрольні коди).

Unicode має 1,114,112 позицій коду. Наразі близько 100 000 з них виділено символам, і багато кодових пунктів стали постійно нехарактерними (тобто не використовуються для кодування жодного символу ніколи), а більшість кодових точок ще не присвоєні.

Єдине, що ASCII і Unicode мають загального , є: 1) Вони є коди символів. 2) 128 перших позицій коду Unicode були визначені такими ж значеннями, як і в ASCII, за винятком того, що позиції коду символів керування ASCII просто визначені як позначення керуючих символів, імена яких відповідають їх іменам ASCII, але їх значення не визначено в Unicode.

Однак іноді Unicode характеризується (навіть у стандарті Unicode!) Як "широкий ASCII". Це гасло, яке в основному намагається передати ідею про те, що Unicode мається на увазі як універсальний код символів так само, як колись був ASCII (хоча репертуар символів ASCII був безнадійно недостатнім для універсального використання), на відміну від використання різних кодів у різні системи та програми та для різних мов.

Unicode як такий визначає лише "логічний розмір" символів: Кожен символ має кодове число у певному діапазоні. Ці кодові номери можуть бути представлені за допомогою різних кодувань передачі, і всередині пам'яті символи Unicode зазвичай представлені за допомогою однієї або двох 16-бітних величин на символ, залежно від діапазону символів, іноді використовуючи одну 32-бітну кількість на символ.


2
Я думаю, що найпоширенішим кодуванням для Unicode є UTF-8 в наші дні. UTF-8 кодує більшість точок коду в 1, 2 або 3 байтах.
Бінарус

14

ASCII і Unicode - це два кодові символи. В основному, вони є стандартами щодо представлення різницьких символів у двійковій формі, щоб їх можна було записати, зберігати, передавати та читати в цифрових носіях. Основна відмінність між ними полягає в тому, як вони кодують символ та кількість бітів, які вони використовують для кожного. ASCII спочатку використовував сім біт для кодування кожного символу. Пізніше це було збільшено до восьми з розширеним ASCII для усунення явної неадекватності оригіналу. На відміну від цього, Unicode використовує змінну програму кодування бітів, де ви можете вибрати між 32, 16 та 8-бітовими кодуваннями. Використання більшої кількості бітів дозволяє використовувати більше символів за рахунок більших файлів, тоді як менша кількість бітів надає вам обмежений вибір, але ви економите багато місця. Використання меншої кількості бітів (тобто

Однією з головних причин, чому Unicode була проблема, виникла з-за багатьох нестандартних розширених програм ASCII. Якщо ви не використовуєте розповсюджену сторінку, яку використовують Microsoft та більшість інших програмних компаній, ви, швидше за все, зіткнетесь із проблемами, коли ваші персонажі з’являються як вікна. Unicode практично усуває цю проблему, оскільки всі точки коду символів були стандартизовані.

Ще одна основна перевага 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.

Взято з: http://www.differencebetween.net/technology/software-technology/difference-between-unicode-and-ascii/#ixzz4zEjnxPhs


1

Зберігання

Дані цифри призначені лише для зберігання 1 символу

  • ASCII ⟶ 2 7 біт ( 1 байт )
  • Розширений ASCII ⟶ 2 8 біт (1 байт)
  • UTF-8 ⟶ мінімум 2 8 , максимум 2 32 біта (хв 1, макс 4 байти)
  • UTF-16 ⟶ мінімум 2 16 , максимум 2 32 біта (хв 2, макс 4 байти)
  • UTF-32 ⟶ 2 32 біта (4 байти)

Використання (станом на лютий 2020 року)

Відсотки веб-сайтів, що використовують різні кодування символів


0

ASCII визначає 128 символів, оскільки Unicode містить репертуар з більш ніж 120 000 символів.


4
-1 для цього тривіального дубліката "Відповідь", що нічого не додає до набагато попередніх відповідей. Будь ласка, не додайте такі дублюючі безладу, як це (отримуйте реп. Іншими способами, які є законними).
cellepo

-1

Крім того, як UTF є надмножиною ASCII, ще одна хороша відмінність між ASCII та UTF полягає в кодуванні файлів диска, представленні та зберіганні даних у випадковій пам'яті. Програми знають, що дані слід розуміти як рядок ASCII або UTF або шляхом виявлення спеціальних кодів байт порядку замовлення на початку даних, або шляхом припущення із наміру програміста, що дані є текстовим, а потім перевірки на наявність шаблонів, які вказують на це в одному чи іншому кодуванні тексту.

Використовуючи традиційне позначення префікса 0xдля шістнадцяткових даних, основним хорошим посиланням є те, що текст ASCII починається з байтових значень 0x00до 0x7Fпредставлення одного з можливих знаків символів ASCII . Текст UTF зазвичай вказується, починаючи з байтів 0xEF 0xBB 0xBFдля UTF8. Для UTF16 запустіть байти 0xFE 0xFFабо0xFF 0xFE використовуйте їх з -ності текстових байтів, зазначеним порядком початкових байтів. Проста наявність значень байтів, які не знаходяться в діапазоні ASCII можливих значень байтів, також вказує на те, що дані, ймовірно, є UTF.

Існують і інші позначки порядку байтів, які використовують різні коди для вказівки, що дані слід інтерпретувати як текст, кодований у певному стандарті кодування.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.