Подтвердить что ты не робот

Что означает 256 для 128 уникальных символов в таблице ascii

Если мне нужно проверить, что строка имеет уникальные символы, я понимаю, если мы рассматриваем символы в таблице Ascii, тогда их будет 128.

Однако почему нам нужно сделать логический массив размером 256 для хранения 128 символов, чтобы проверить, существовал ли элемент хотя бы один раз в строке? Должен ли быть недостаточно логический массив размера 128?

Вот цитата из книги "Cracking the Coding Interview":

if (str.length() > 128) return false;
boolean[] char_set = new boolean[256]; //which is strange since it clearly says over 128 its false

.....

4b9b3361

Ответ 1

В принципе, мы используем только 128 тотальных символов, которые используются в основном во время программы. Но общее количество символов в таблице ASCII составляет 256 (от 0 до 255). 0 до 31 (всего 32 символа) вызывается как управляющие символы ASCII (код символа 0-31). Символ от 32 до 127 называется ASCII печатными символами (код символа 32-127). 128 до 255 называется расширенным кодом ASCII (код символа 128-255).

проверить ссылку: http://www.ascii-code.com/

Большая часть расширенного символа ASCII отсутствует на клавиатуре QWERTY (ENGLISH), поэтому по этой причине автор взял 128 тотальных символов в этом примере в книге "Cracking the coding interview".

Ответ 2

Нет, есть 256 символов ASCII. Это включает в себя стандартные символы ASCII (0-127) и расширенные символы ASCII (128-255).

Для получения дополнительной информации. Пожалуйста, обратитесь к: http://www.flexcomm.com/library/ASCII256.htm

Ответ 3

Многие люди в наши дни используют термин " ASCII " небрежным образом для описания ISO-8859-1 (также известного как Latin-1), набора символов, который включает в себя [32.. 126] значения печатных символов в старом временный набор символов ASCII, а также значения в диапазоне [128..255]. Latin-1 достаточно хорошо справляется с освещением западноевропейских языков, в то время как ASCII ограничен неакцентированными символами, используемыми в базовом английском языке.

ASCII также включает управляющие символы в диапазоне [0-31] и 127. Они не представляют печатные символы (хотя Unicode предоставляет символы в этих позициях). Это return, linefeed, tab, ctrl-c, formfeed и тому подобное. Некоторые из них являются пережитками древних времен телетайпных и телексных машин.

Teletype with 8-channel paper tape punch and reader

Обратите внимание, что бумажная лента имеет восемь битовых позиций в каждом кадре. Это биты ASCII/Latin-1. "Удалить" или "Рубут" - это 127 или 0111 1111. Почему? потому что можно было выбить все семь отверстий в ленте и так стереть персонажа.

Это может быть связано с предложением использовать 256-позиционный массив для табулирования текста в таком наборе символов.

Ответ 4

Я считаю, что использование 128 и 256 в одной и той же функции является ошибкой в этом издании книги. В более новой 6-й редакции (2016 г.) пример кода гласит:

if (str.length() > 128) return false;
boolean[] char_set = new boolean[128];

и автор добавляет комментарий:

Это нормально, чтобы принять 256 символов. Это будет иметь место в расширенной ASCII.

Таким образом, использование либо 128 или 256, а не как, для этой книги упражнений.

Ответ 5

Автор, вероятно, перепутал символы и байты. Вы также должны понимать связанную концепцию кодирования.

Байт составляет восемь бит. Байт традиционно использовался для хранения символа, хотя очень ранним компьютерам для хранения символа требовалось всего 7 бит. Стандарт ASCII для кодирования символов в 7 битов был ратифицирован в 1963 году, хотя в то время были и конкурирующие кодировки символов (из которых EBCDIC до сих пор сохранился).

Когда вы используете только 7 из доступных 8 битов, у вас могут возникнуть идеи о том, что делать с резервным битом. Одним из распространенных подходов было кодирование дополнительных нестандартных символов, которые не были доступны в стандарте ASCII. Было определено большое количество устаревших 8-битных кодировок, некоторые из которых также были опубликованы в качестве стандартов. Некоторые популярны даже по сей день; некоторые примеры - ISO-8859-1 (он же Latin-1) и кодовые страницы Windows (437, 850 и 1252 по-прежнему широко используются в западных странах, несмотря на их многочисленные недостатки). Многие из них являются расширенными кодировками ASCII, которые совместимы с ASCII в первых 128 байтах; хотя термин "расширенный ASCII" не является технически четко определенным.

Если вы обрабатываете последовательность байтов, вы хотите иметь возможность обрабатывать байтовые значения в диапазоне 0-255, а не только те, которые определены в ASCII. С другой стороны, если у вас есть гарантии, что ни один из байтов, которые вы собираетесь обрабатывать, не будет иметь значений выше 127 (например, если известно, что ваш ввод ASCII, потому что он поступает из источника, который не способен произвести что-либо еще), чрезмерно резервировать место для ценностей, которые, как вы знаете, вам не понадобятся.

В дальнейшем большинство современных систем используют Unicode в той или иной форме. В Windows и, видимо, все еще в Java, вы должны ожидать UTF-16; в других местах UTF-8 быстро становится стандартом де-факто. Оба из них требуют, чтобы ваш код был способен аккуратно обрабатывать 8-битные байты, хотя кодовые точки не (обязательно, в UTF-8 или вообще не в UTF-16) кодируются в один байт.

Что касается отправленного вами кода, вы правы в том, что 128 позиций символов достаточно, если вы отбрасываете любой байт, значение которого больше 127. С другой стороны, в зависимости от того, какие данные вы собираетесь обрабатывать, отбрасывание не-ASCII символов может все будет правильно; и затем, если вы ничего не отбрасываете, вам нужно обработать все 256.