В чем точная разница между Unicode и ASCII?
Всего ASCII имеет 128 символов (256 в расширенном наборе).
Есть ли какие-либо спецификации размера для символов Юникода?
В чем точная разница между Unicode и ASCII?
Всего ASCII имеет 128 символов (256 в расширенном наборе).
Есть ли какие-либо спецификации размера для символов Юникода?
Ответы:
ASCII определяет 128 символов, которые соответствуют номерам 0–127. Unicode определяет (меньше) 2 21 символов, которые аналогично отображаются на номера 0–2 21 (хотя не все номера в настоящее время назначены, а некоторые зарезервированы).
Unicode - это расширенный набор ASCII, а числа 0–127 имеют то же значение в ASCII, что и Unicode. Например, число 65 означает «латинская заглавная« А »».
Поскольку символы Unicode обычно не помещаются в один 8-битный байт, существует множество способов хранения символов Unicode в последовательностях байтов, таких как UTF-32 и UTF-8.
Понимание того, почему 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 использует набор 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. И язык выполнения, как 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, так и порядок байтов и является нейтральным для механизма визуализации текста. К сожалению, это не является обязательным, и многие программисты заявляют о своем праве опустить его, так что несчастные случаи все еще довольно распространены.
Java поддерживает Unicode, т.е. поддерживает все алфавиты по всему миру. Следовательно, размер символа в java составляет 2 байта. И диапазон от 0 до 65535.
ASCII имеет 128 позиций кода, выделенных графическим символам и управляющим символам (управляющим кодам).
Юникод имеет 1,114,112 позиций кода. Около 100 000 из них в настоящее время распределены по символам, и многие кодовые точки сделаны постоянно не символами (то есть не используются для кодирования каких-либо символов), а большинство кодовых точек еще не назначены.
Единственное, что ASCII и Unicode имеют общего , являются: 1) Они являются коды символов. 2) 128 первых позиций кода Unicode были определены, чтобы иметь те же значения, что и в ASCII, за исключением того, что позиции кода контрольных символов ASCII просто определены как обозначающие контрольные символы с именами, соответствующими их именам ASCII, но их значения не определено в Юникоде.
Однако иногда Unicode характеризуется (даже в стандарте Unicode!) Как «широкий ASCII». Это лозунг, который в основном пытается донести идею о том, что Unicode должен быть универсальным символьным кодом так же, как когда-то был ASCII (хотя символьный репертуар ASCII был безнадежно недостаточен для универсального использования), в отличие от использования различных кодов в разные системы и приложения и для разных языков.
Юникод как таковой определяет только «логический размер» символов: каждый символ имеет кодовый номер в определенном диапазоне. Эти кодовые номера могут быть представлены с использованием различных кодировок передачи, и внутри, в памяти, символы Юникода обычно представлены с использованием одной или двух 16-битных величин на символ, в зависимости от диапазона символов, иногда с использованием одной 32-битной величины на символ.
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.
Указанные цифры предназначены только для хранения 1 символа
ASCII определяет 128 символов, так как Unicode содержит репертуар из более чем 120000 символов.
Помимо того, что UTF является надмножеством ASCII, еще одно хорошее различие, которое нужно знать между ASCII и UTF, заключается в кодировании файлов на диске и представлении и хранении данных в произвольной памяти. Программы знают, что данные данные следует понимать как строку ASCII или UTF либо путем обнаружения специальных кодов меток порядка байтов в начале данных, либо исходя из намерения программиста, что данные являются текстовыми, а затем проверяют их на наличие шаблонов, которые указывают, что они в той или иной кодировке текста.
Используя обычную префиксную нотацию 0x
для шестнадцатеричных данных, основная хорошая справка заключается в том, что текст ASCII начинается со байтовых значений 0x00
и 0x7F
представляет одно из возможных значений символов ASCII . Текст UTF обычно указывается, начиная с байтов 0xEF 0xBB 0xBF
UTF8. Для UTF16 начальные байты 0xFE 0xFF
или 0xFF 0xFE
используются с порядком байтов текста, указанным в порядке начальных байтов. Простое присутствие значений байтов, которые не входят в диапазон возможных значений байтов ASCII, также указывает на то, что данные, вероятно, являются UTF.
Существуют и другие метки порядка байтов, в которых используются разные коды для указания того, что данные должны интерпретироваться как текст, закодированный в определенном стандарте кодирования.