Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

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




Строки

 

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

Знаете ли вы, что у народа острова Бугенвиль самый короткий алфавит в мире? Алфавит языка ротокас состоит всего из 12 букв: A, E, G, I, K, O, P, R, S, T, U, и V. На другом конце этой своеобразной числовой оси расположились такие языки, как китайский, японский и корейский, насчитывающие тысячи символов. Английский, конечно, содержит всего 26 букв — 52, если считать буквы и верхнего, и нижнего регистров — плюс горстка знаков пунктуации! @#$%&.

Когда люди говорят «текст», они подразумевают «буквы и символы на экране компьютера». Но компьютеры не работают с буквами и символами; они работают с битами и байтами. Каждый фрагмент текста, который вы когда-либо видели на экране компьютера, на самом деле хранится в определенной кодировке. Грубо говоря, кодировка символов обеспечивает соответствие того, что вы видите на экране и того, что на самом деле хранится в памяти или на диске. Существует много различных кодировок символов, некоторые из них оптимизированы для конкретных языков, например русского, китайского или английского, другие могут быть использованы сразу для нескольких языков.

В действительности, все гораздо сложнее. Многие символы являются общими для нескольких кодировок, но каждая кодировка может использовать свою последовательность байтов для хранения их в памяти или на диске. Вы можете думать о кодировке символов, как о разновидности криптографического ключа. Всякий раз, когда вам передают последовательность байтов — файл, веб-страницу, все равно — и утверждают, что это «текст», вам необходимо понять, какая кодировка использовалась. Зная кодировку, вы сможете декодировать байты в символы. Если вам дают неправильный ключ или не дают ключа вовсе, вам не остается ничего, кроме как попытаться взломать код самостоятельно. Скорее всего, в результате вы получите кучу крякозябров (gibberish — тарабарщина, невнятная речь, но так понятнее, прим. перев. ). Все, что вы знали о строках — неверно.

Все, что вы знали о строках — неверно.

Несомненно, вам приходилось видеть такие веб-страницы, со странными вопросительными знаками на месте апострофов. Обычно это означает, что автор страницы неправильно указал их кодировку, вашему браузеру осталось просто угадать ее, а результатом стала смесь ожидаемых и совершенно неожиданных символов. В английском языке это просто раздражает; в других языках результат может стать совершенно нечитаемым.

Существуют кодировки для всех основных мировых языков. Но, поскольку, языки существенно отличаются друг от друга, а память и дисковое пространство раньше были дорогими, каждая кодировка оптимизирована для конкретного языка. Под этим я подразумеваю то, что для представления символов своего языка, все кодировки используют один и тот же диапазон чисел (0-255). Например, вы вероятно знакомы с кодировкой ASCII, которая хранит символы английского языка в виде чисел от 0 до 127. (65 — заглавная «A», 97 — строчная «a» и т. д. ) Английский алфавит очень простой и может быть представлен менее, чем 128 числами. Если вам известна двоичная система счисления, вы понимаете, что в байте задействовано всего 7 битов из 8.

Западноевропейские языки, такие как французский, испанский и немецкий содержат больше символов, чем английский. Точнее, они содержат символы с различными диакритическим знаками, например, испанский символ ñ. Самая распространенная кодировка для этих языков — CP-1252, также известная как «windows-1252», что связано с широким использованием ее в операционной системе Microsoft Windows. В кодировке CP-1252 символы с номерами от 0 до 127 такие же, как и в ASCII, а остальной диапазон используется для таких символов как n-с-тильдой-сверху (241), u-с-двумя-точками-сверху (252) и т. д. Однако, это все еще однобайтная кодировка; максимально возможный номер 255 еще помещается в один байт.

А еще существуют такие языки, как китайский, японский и корейский, которые имеют так много символов, что они требуют многобайтовых кодировок. Это означает, что каждый «символ» представляется двухбайтовым числом от 0 до 65535. Но различные многобайтные кодировки всё равно имеют ту же проблему, что и различные однобайтные кодировки: каждая кодировка использует одинаковые числа для обозначения разных вещей. Отличие лишь в том, что диапазон чисел больше, потому что нужно кодировать намного больше символов.

Это было вполне нормально в несетевом мире, где вы набирали «текст» для себя и иногда распечатывали его. В этом мире не было ничего кроме «обычного текста» (не знаю, м. б. быть вообще не переводить “plain text” — прим. перев. ). Исходный код был в кодировке ASCII, а для всего остального использовались текстовые процессоры, которые определяли свои собственные (нетекстовые) форматы, в которых, наряду с информацией о форматировании, отслеживалась и информация о кодировке. Люди читают эти документы с помощью такого же текстового процессора, какой использовался и для их создания, так что, все более или менее работало.

Теперь подумайте о распространении глобальных сетей, таких как e-mail и web. Множество «обычного текста» перемещается вокруг планеты, создаётся на одном компьютере, передаётся через второй и принимается и отображается третьим компьютером. Компьютеры видят только числа, но числа могут иметь различное значение. О нет! Что же делать? Системы были спроектированы таким образом, чтобы передавать информацию о кодировке вместе с каждым отрывком «обычного текста». Вспомните, это криптографический ключ, устанавливающий соответствие между числами и понятными человеку символами. Потерянный ключ означает искаженный текст или кракозябры, если не хуже.

Теперь подумайте о задаче хранения различных отрывков текста в одном месте, например в одной таблице базы данных, хранящей все когда-либо полученные вами email сообщения. Вам всё ещё нужно хранить кодировку вместе с каждым отрывком текста, чтобы иметь возможность прочитать его. Думаете, это трудно? Попробуйте реализовать поиск в этой базе данных, с преобразованием на лету между множеством кодировок. Разве это не забавно?

Теперь подумайте о возможности многоязычных документов, где символы из нескольких языков находятся рядом в одном документе. (Подсказка: программы, которые пытаются делать это, обычно используют коды смены алфавита для переключения «режимов». Бац, и вы в русском режиме KOI8-R, и 241 означает Я; бац, и теперь вы в греческом режиме для Macintosh, и 241 означает ώ. ) И конечно вы так же захотите осуществлять поиск по этим документам.

Теперь плачьте, т. к. все, что вы знали о строках — неверно, и нет такого понятия «обычный текст».

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...