В чем разница между ASCII и Unicode?

408

В чем точная разница между Unicode и ASCII?

Всего ASCII имеет 128 символов (256 в расширенном наборе).

Есть ли какие-либо спецификации размера для символов Юникода?

Ashvitha
источник

Ответы:

534

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

Unicode - это расширенный набор ASCII, а числа 0–127 имеют то же значение в ASCII, что и Unicode. Например, число 65 означает «латинская заглавная« А »».

Поскольку символы Unicode обычно не помещаются в один 8-битный байт, существует множество способов хранения символов Unicode в последовательностях байтов, таких как UTF-32 и UTF-8.

Керрек С.Б.
источник
4
@riderBill: что теперь? О каких 3 битах ты говоришь? В Unicode нет битов. Просто кодовые точки.
Kerrek SB
@riderBill: еще раз: о каких 3 байтах вы сейчас говорите? :-) (Ничто из этого не имеет отношения к Юникоду. Юникод предназначен только для присвоения значения цифрам, а не для битов и байтов.)
Kerrek SB
8
@riderBill: Unicode не "использует от 1 до 4 байтов". Юникод - это присвоение значений числам. Он не использует байты. Существуют определенные стандартизированные схемы кодирования для представления кодовых точек Unicode в виде потока байтов, но они ортогональны Unicode в качестве набора символов. (Да, не стесняйтесь удалять по
своему усмотрению
@CleanCrispCode Unicode на самом деле является расширенным набором ISO-8859-1 , который сам по себе является расширенным набором ASCII. Иногда это полезно знать.
Марк Рэнсом
8
Для того, чтобы уточнить, Unicode набор символов сам по себе является подмножеством ISO-8859-1 набор символов , но UTF-8 кодирование является не надмножество ISO-8859-1 кодирования , но ASCII кодирования .
minmaxavg
393

Понимание того, почему 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

Некоторые умные люди начали использовать 8-й бит (бит, используемый для проверки четности) для кодирования большего количества символов для поддержки их языка (например, для «é», например, на французском). Использование одного дополнительного бита удвоило размер исходной таблицы 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. Юникод не содержит каждого символа из каждого языка, но он содержит огромное количество символов ( см. Эту таблицу ).

Вы не можете сохранить текст на жестком диске как «Юникод». Юникод - это абстрактное представление текста. Вам нужно «закодировать» это абстрактное представление. Вот где кодирование вступает в игру.

Кодировки: 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 комбинаций. Думайте об этом как о кодовом замке с семью колесами, каждое колесо имеет только два числа.

Источник: Wikipedia , это отличное сообщение в блоге и Mocki, где я первоначально разместил это резюме.

Эндрю
источник
7
Там нет текста, но закодированный текст. Некоторые кодировки очень просты, особенно для наборов символов с <= 256 кодовыми точками. «Extended ASCII» - очень двусмысленный термин; есть такие, которые поддерживают греческий, русский и / или польский языки. ASCII недостаточно для английского текста, который использует á, ü, ç, ñ. Я подозреваю, что он был разработан для поддержки компьютерных языков, а не человеческих языков. Догматично, когда вы пишете файл или поток, у вас есть набор символов и выбрать кодировку. Ваш читатель должен получить байты и знать, какую кодировку. В противном случае связь не удалась.
Том Блоджет
Большое спасибо за добавление. Я обновил ответ соответственно.
Андрей
Спасибо. Я замечаю, что везде таблицы ASCII показывают коды символов в виде 0-127, но таблицы UTF-8 показывают коды в виде шестнадцатеричных, а не целых чисел. Есть причина для этого? Почему таблицы UTF-X не показывают 0-127 / 255/65535 против 00-AF? Это что-нибудь значит?
wayofhefuture
Спасибо за ответ. Быстрый вопрос: «В UTF-16 длина символа начинается с 16 битов» - означает ли это, что буквенно-цифровые символы не могут быть представлены в UTF-16, поскольку они являются только 8-разрядными символами?
Moondra
Отличный ответ, только у меня есть одна проблема - польский язык действительно использует другой алфавит? Я думал, что мы используем тот же, что и английский, только с некоторыми дополнительными буквами?
Никофиси
89

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

Юникод пришел, чтобы решить эту катастрофу. Версия 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 "лучший". Их связь с настройками по умолчанию операционной системы в значительной степени очерчивает черту. Одной контрмерой является определение спецификации, метки порядка байтов, специальной кодовой точки (U + FEFF, пробел нулевой ширины) в начале текстового потока, которая указывает, как кодируется остальная часть потока. Он указывает как кодировку UTF, так и порядок байтов и является нейтральным для механизма визуализации текста. К сожалению, это не является обязательным, и многие программисты заявляют о своем праве опустить его, так что несчастные случаи все еще довольно распространены.

Ганс Пассант
источник
31

Java поддерживает Unicode, т.е. поддерживает все алфавиты по всему миру. Следовательно, размер символа в java составляет 2 байта. И диапазон от 0 до 65535.

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

Сиддарт Кантед
источник
Ключевая картина, чтобы объяснить .. Ницца
Понмари Субраманян
2
Жаль, что это неправильно. «Коды ASCII (128)» будут правильными.
Марк Толонен
15

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

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

Единственное, что ASCII и Unicode имеют общего , являются: 1) Они являются коды символов. 2) 128 первых позиций кода Unicode были определены, чтобы иметь те же значения, что и в ASCII, за исключением того, что позиции кода контрольных символов ASCII просто определены как обозначающие контрольные символы с именами, соответствующими их именам ASCII, но их значения не определено в Юникоде.

Однако иногда Unicode характеризуется (даже в стандарте Unicode!) Как «широкий ASCII». Это лозунг, который в основном пытается донести идею о том, что Unicode должен быть универсальным символьным кодом так же, как когда-то был ASCII (хотя символьный репертуар ASCII был безнадежно недостаточен для универсального использования), в отличие от использования различных кодов в разные системы и приложения и для разных языков.

Юникод как таковой определяет только «логический размер» символов: каждый символ имеет кодовый номер в определенном диапазоне. Эти кодовые номера могут быть представлены с использованием различных кодировок передачи, и внутри, в памяти, символы Юникода обычно представлены с использованием одной или двух 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 7 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 32 2 32 бита (4 байта)

Использование (по состоянию на февраль 2020 г.)

Процент сайтов, использующих различные кодировки символов

Хасан Сефа Озалп
источник
0

ASCII определяет 128 символов, так как Unicode содержит репертуар из более чем 120000 символов.

sphynx888
источник
4
-1 для этого тривиального дубликата «Ответить», не добавляющего ничего к более ранним предыдущим ответам. Пожалуйста, не добавляйте дублирующий беспорядок, как этот (получите репутацию другими способами, которые являются законными).
cellepo
-1

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

Используя обычную префиксную нотацию 0xдля шестнадцатеричных данных, основная хорошая справка заключается в том, что текст ASCII начинается со байтовых значений 0x00и 0x7Fпредставляет одно из возможных значений символов ASCII . Текст UTF обычно указывается, начиная с байтов 0xEF 0xBB 0xBFUTF8. Для UTF16 начальные байты 0xFE 0xFFили 0xFF 0xFEиспользуются с порядком байтов текста, указанным в порядке начальных байтов. Простое присутствие значений байтов, которые не входят в диапазон возможных значений байтов ASCII, также указывает на то, что данные, вероятно, являются UTF.

Существуют и другие метки порядка байтов, в которых используются разные коды для указания того, что данные должны интерпретироваться как текст, закодированный в определенном стандарте кодирования.

stackuser83
источник