Кодировка символов. Уникод во Flash

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

Немного истории
До сих пор иногда компьютеры называют ЭВМ — электронно-вычислительными машинами. Эта аббревиатура появилась в те времена, когда их единственным назначением были математические вычисления. И хотя за прошедшие десятилетия вид «умных» машин изменился до неузнаваемости, принципы их работы остались те же. Компьютеры могут оперировать с числами — и больше ничего.

«Почему это компьютеры могут работать только с числами? — возразите вы. — А как же графика, видео, звук?!» Дело в том, что и графика, и видео, и звук — все эти замечательные возможности современных ЭВМ являются цифровыми. Так, растровый рисунок является просто последовательностью чисел, описывающих яркость и цветность его пикселей. Оцифрованный звук представляет собой длинные столбцы чисел, хранящих информацию об особенностях колебаний воздуха каждые 1/44100 секунды. Цифровым является и текст.

Как, используя только числа, можно сохранить текстовую информацию? Очевидно, для этого необходимо каждому символу поставить в соответствие число.


Например, число 1 будет означать, что на мониторе необходимо отобразить букву А, 2 — букву Ь и т. д. Таблица подобных соответствий символов их порядковым номерам называется кодировкой.

Сколько символов может включать таблица кодировки? Это определяется длиной двоичных чисел, которые способен хранить компьютер. В те времена, когда разрабатывались первые системы кодировок, стандартным размером ячейки памяти вычислительной машины были 8 бит (отсюда появление такой единицы измерения памяти, как байт, 1 байт = 8 бит). Используя их, можно было закодировать 28 = 256 символов.

Пионерами в области разработки кодировок были американцы. Экономя каждый бит (оперативная память была в свое время невероятно дорогая), они использовали ровно половину от возможных 256 позиций, создав 128-символьную систему кодировки. Называлась она ASCII, и в ней имелись буквы латинского алфавита обоих регистров, цифры, математические операторы, знаки препинания и некоторые служебные символы, вроде возврата каретки или знака табуляции. Эта система кодировки используется до сих пор.

Покупая американские компьютеры, Западная Европа автоматически приняла ASCII за стандарт.

Правда, во многих европейских языках имеются символы, которых в этой системе кодировки не было — например, различные надстрочные знаки.


Пригодились свободные 128 позиций американки ASCII, которые были израсходованы на обеспечение особенностей многочисленных национальных алфавитов. Лимита в 256 символов хватило и на то, чтобы добавить в новую систему кодировки знаки псевдографики, предназначавшиеся для создания таблиц и оформления заголовков, а также некоторые специальные символы. Результатом же стала Latinl — самая распространенная на данный момент система 8-битной кодировки.Система Latinl не включает символов кириллицы. В те времена, когда она создавалась, Советский Союз производил собственные компьютеры, на которых использовались разработанные отечественными НИИ и никому за пределами «железного завеса» не известные системы кодировок. В конце 80-х гг. прошлого века отставание нашей электроники стало столь значительным, что волей неволей пришлось начать импортировать вычислительную технику с «загнивающего» Запада. При этом возникла существенная трудность — как, сохранив работоспособность приложений, «научить» американские машины работать с русским текстом.

Описанная проблема имела два потенциальных решения. Можно было расширить кодовое пространство, перейдя с 1-байтной кодировки на 2-байтную (при этом можно было бы хранить 65 356 символов вместо 256).


Конечно, размер текстовых файлов при этом увеличился бы в два раза, но в те времена проблема экономии памяти уже остро не стояла. Сложность была в другом. Все созданные к тому времени программы были рассчитаны на 8-битные таблицы символов. Отказаться от них или быстро их переделать было невозможно — это требовало невероятных финансовых вложений. Поэтому пришлось пойти другим путем и создать новую кодировку, базируясь на Latinl. При этом наименее необходимые для русскоязычного пользователя символы Latinl были заменены буквами кириллицы. Латинские буквы и символы псевдографики пришлось оставить на своем месте — иначе нельзя было бы использовать программы от западных разработчиков.

Аналогично действовали в вопросе кодировок и ряд других стран — Греция, Иран, Болгария и др. В результате возникло множество кодировок, совершенно не совместимых друг с другом. Их число приумножило появление Windows, использовавшей собственные кодировки для национальных языков.

Как приложению, рассчитанному на работу с текстом, определить, что данный файл создан русским, а тот —арабом, если в обоих случаях информация представляет просто последовательность 8-битных цифр? Очевидно, что текстовый файл должен хранить указание, исходя из какой кодировки он должен быть выведен на экран или принтер. При этом само приложение должно иметь доступ к таблицам, в которых указано, какому символу соответствует некоторая позиция в данной кодировке. Такие таблицы называются кодовыми страницами.

Наличие множества кодировок стало причиной значительного числа проблем, с которыми столкнулись пользователи и разработчики в 1990-х гг. Например, браузеры далеко не всегда могли правильно определять, какую кодовую страницу нужно использовать для показа каждого конкретного сайта. В таких случаях вместо текста отображались разного рода экзотические символы, и бедному пользователю приходилось подбирать кодировку самостоятельно (многие же просто уходили с ресурса, так как не имели представления о причинах возникшей трудности). Мощности же компьютеров все возрастали, развитие интернета способствовало глобализации информационного пространства — и концепция 8-битных кодовых страниц окончательно перестала себя оправдывать.

Расширение кодового пространства до 16 бит стало неизбежным. Однако главной причиной тотального перехода на 16-битный текст ведущих производителей программного обеспечения в конце 1990-х гг. стала заинтересованность в рынке сбыта в странах Дальнего Востока, использующих, как известно, иероглифическое письмо. Только в одном китайском алфавите более 20 тыс. (!) символов. Естественно, что никакие ухищрения с 8 битами не помогут создать кодировку для этого языка. Чувство же национальной гордости не позволяет китайцам или японцам перейти со своей громоздкой и нерациональной письменности на латиницу.

Итак, возникла задача создания единой системы кодировки для всех стран мира, которая включала бы в себя все алфавиты, знаки и служебные символы, использующиеся человечеством. Эта система была названа Unicode (уникод). Она способна сохранять более 65 тыс. символов, что вполне достаточно для обеспечения потребностей всех народов и профессиональных групп. В настоящий момент имеется бета-версия четвертого выпуска Unicode, уже 32-битная. Ее лимиты объективно неисчерпаемы. Полную информацию о кодировке Unicode можно получить на официальном сайте разрабатывающего ее консорциума http://www.unicode.org.В уникоде каждому символу соответствует определенная неизменная позиция. В различных же 8-битовых кодировках на одном и том же месте могут оказаться разные знаки. Чтобы при конвертировании текста в Unicode был сохранен его смысл, используются кодовые страницы. В этих страницах прописывается, какая позиция в Unicode содержит такой же символ, какой выводится исходя изданного 8-битового числа при применении этого типа кодировки. Например, в США распространена страница кодировки 1252, кириллицу определяет страница 1251 и т.д. Обычно в заголовке текстовых файлов указывается номер кодовой страницы. Первые 256 символов в уникоде совпадают с последовательностью знаков в Latin 1.

Переход на уникод был трудным и болезненным (и пока он далеко не завершен). Но так или иначе, практически все современные приложения умеют работать с 16-битными текстами. Первые версии Flash не поддерживали в полной мере Unicode, хотя спецификация ЕСМА-262 этого требовала. Это было связано прежде всего с тем, что такая поддержка резко увеличила бы размер проигрывателя. Во Flash MX была введена возможность работы с текстом в Unicode. «Вес» плейера действительно увеличился более чем в Зраза (с 250 до 800 Кб), но это, ввиду общепризнанности swf-формата, уже не имело принципиального значения. Во Flash MX 2004 в формате уникода начала работать и среда разработки Flash. Зачем необходим уникод в фильмах Flash? Во-первых, становится возможным использовать в одном фильме несколько языков. Во-вторых, исчезают проблемы с кодировками. Так, сайт на арабском или японском языках раньше вы бы не смогли просмотреть, так как Flash-плейер использовал ту страницу кодировки, которая применялась операционной системой компьютера (а американцы, соответственно, не увидели бы текстов вашего русскоязычного фильма). В-третьих, появляется возможность без труда добавлять специальные символы (например, смайлики или математические знаки). В общем, польза от перехода на 16-битные тексты очевидна. Однако работа с уникодом не так проста, как с «обычным» текстом. Ее особенности мы рассмотрим ниже.

Поддержка уникода Flash-плейером
Flash Player полностью поддерживает уникод, начиная с Flash MX. Более того, 16-битный формат текста является основным в нем. Так как Flash-плейер любой текст воспринимает (по умолчанию) как уникод, то любые поступающие в фильм текстовые данные должны иметь именно такую кодировку.

Существует несколько форм уникода. Flash-плейер способен поддерживать 8-битовый Unicode-формат (UTF-8) и две разновидности 16-битового уникода (UTF-16 BE (Big Endian) и UTF-16 LE (Little Endian)).

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

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

Поддержка уникода средой разработки
Поддержка уникода Flash-плейером была введена еще в прошлой версии программы. Однако сре-да разработки могла работать только с текстом в 8-битовоЙ кодировке. Это вызывало определенные сложности. Например, нельзя было протестировать, какому символу соответствует та или иная escape-последовательность при помощи панели Output — для этого приходилось создавать текстовое поле. То, как отображаются имена идентификаторов, зависело от используемой операционной системой кодовой страницы. Поэтому, если вы применяли русскоязычные имена, то для американца ваш код был бы абсолютно нечитабельным.

Во Flash MX 2004 среда разработки наконец начала поддерживать уникод (UTF-8). Это означает, что имена могут быть заданы даже на китайском языке — и они будут абсолютно корректно работать. Поддерживает уникод и панель Output, в чем можно убедиться, набрав следующий код:

trace("\u9456\u5674\u7221\u7867"); // Выводит четыре иероглифа

Главная причина, по которой необходимо помнить, что теперь код ActionScript сохраняется в формате уникода, связана с использованием библиотек функций и классов, созданных в предыдущих версиях программы. Если вы импортируете такую библиотеку в фильм Flash 7, она с высокой степенью вероятности не будет работать.

Чтобы использовать код, сохраненный в восьмибитовом формате, нужно изменить настройки экспорта панели Actions. Для этого в меню панели задействуйте команду Preferences. В меню Open/Import открывшейся панели смените пункт UTF-8 на Default Encoding. При этом код будет импортироваться исходя из кодировки по умолчанию. Аналогичным образом можно сменить кодировку записи as-файлов (меню Save/Export). Это необходимо, если вы хотите, чтобы ваш код могли использовать разработчики, работающие во Flash MX или Flash 5.

Добавление символов уникода
Начиная со Flash MX 2004, среда разработки Flash начала поддерживать уникод. Это означает, что любой символ может быть введен вами в идентификатор или строковый литерал непосредственно.

Например, вы можете найти нужный служебный символ при помощи специального инструмента Word или другого текстового редактора, поддерживающего уникод, скопировать его и вставить в поле имени Инспектора Свойств или на нужную позицию в тексте кода. Полученный таким образом идентификатор или строковый литерал будет работать абсолютно корректно (главное, чтобы в операционную систему были включены необходимые шрифты):

var ="Привет"; // Создаем переменную с именем на китайском языке
trace ( ); // Выводит: Привет

Уникод является внутренним форматом fla-файлов. Это означает, что идентификаторы и строкоые литералы будут отображаться одинаково вне зависимости от того, какую кодовую страницу использует операционная система.

На практике текст с символами, которые не могут быть добавлены на данном компьютере при помощи клавиатуры, создавать напрямую в среде разработки не очень удобно. Существуют и другие способы задания Unicode-символов помимо простого копирования из более мощного, чем панель Actions, текстового редактора. Перечислим их:

• Можно добавить символы Unicode в текстовые литералы, используя escape-последовательности.

• Можно включить в фильм на стадии публикации внешний текстовый файл при помощи директивы #include.

• Можно скачать внешний текстовый или ХМL-файл, для чего используются такие элементы ActionScript, как функции loadVariables() либо классы LoadVars или XML.

Каждый из приведенных способов подходит для выполнения определенных задач. Рассмотрим их по отдельности.Наиболее простой из перечисленных подход к добавлению в текст символов Unicode связан с использованием escape-последовательностей, заданных по следующей схеме: \uXXXX, где ХХХХ — шестнадцатеричный код необходимого знака (эта стандартная формула для введения уникода в таких языках, как C++ или Java). Определить, какой код соответствует символу, можно на сайте консорциума Unicode. Здесь, в разделе Charts (http://www.unicode.org/charts/), находятся таблицы со всеми включенными в уникод на данный момент буквами, иероглифами и знаками. Найти среди них нужный символ совсем несложно, так как информация распределена по категориям. Коды основных символов позволят определить и Word (см. панель, открываемую командой Вставка ► Символ).

Если на языке, отличном от языка операционной системы, нужно включить в фильм достаточно большой фрагмент текста, то задавать его при помощи escape-последовательностей нерационально. Гораздо лучше воспользоваться возможностью среды разработки ActionScript по включению в сценарии внешних текстовых файлов. Как вы помните, для этого предназначена директива #include.

Рассмотрим данный способ ввиду сложности по пунктам:

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

2. В одном из текстовых редакторов, поддерживающих Unicode (например, Notepad для Windows 2000 или UltaEdit), наберите необходимый текст. Затем оформите его как строку (возьмите в кавычки) и присвойте переменной my_uni_text.

3. В первой строке документа наберите следующий заголовок:

//!- UTF8

Данный заголовок необходим, чтобы сообщить Flash, в каком формате сохранен текст. По умолчанию директива #include включает в код текстовую информацию как 8-битовую, трактуя ее исходя из кодовой страницы операционной системы. Заголовок должен быть набран строго правильно.

Так, например, если вы пропустите пробел после второго тире, то текст не будет включен в фильм в Unicode-формате, а будет представлять набор букв и цифр из стандартной кодировки.

4. Сохраните файл в формате UTF-8 (данный формат наиболее широко распространен в сети, так как создаваемые в нем текстовые файлы занимают меньший объем, чем закодированные, исходя из UTF-16 BE или UTF-16 LE). Назовите его my_text.as (as — это рекомендованное расширение для текстовых библиотек ActionScript кода, однако можно использовать и txt).

5. Наберите следующий код (обратите внимание, что адрес текстового файла должен быть строкой и что завершать выражение точкой с запятой не следует):

#include "my_text.as" // Путь к файлу может быть
// как относительным, так и абсолютным

6. Тестируйте или опубликуйте фильм. Если не было допущено ошибок, данный Unicode-текст отобразится в динамическом поле.

Наиболее универсальный способ добавления иноязычных текстов в фильм связан с подгрузкой хранящих их внешних текстовых или XML-файлов с использованием функций loadVariables() или методов классов XML и LoadVars. При этом, подобно применению директивы #include, можно импортировать достаточно объемные Unicode-тексты. У данного способа есть преимущества. Во-первых, вы можете добавлять тексты в уже скомпилированные swf-фильмы. А это чрезвычайно актуально в случае сайтов, информация на которых должна постоянно обновляться: не резонно было бы для этого закачивать на сервер каждый раз новую версию страницы. Во-вторых, можно использовать не только формат UTF-8, но и более совершенные 16-битные форматы Unicode.

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

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

При чтении текстовых данных из внешнего файла Flash-плейер обращается к специальной метке, показывающей, какой формат кодировки уникода был использован. Эта метка называется BOM (byte order mark — метка байтового порядка) и сохраняется в двух первых байтах файла. Если она не указана, по умолчанию используется формат UTF-8. BOM для 16-битных форматов Unicode задаются по следующим правилам:

• если первый байт равен 0xFE, а второй — 0xFF, то используется UTF-16 BE (Big Endian);

• если первый байт равен 0xFF, а второй — 0xFE, то применяется UTF-16 LE (Little Endian).

Большинство текстовых редакторов, сохраняя текстовые файлы в форматах UTF-16 BE и LE, автоматически выставляют ВОМ. Поэтому вам вряд ли придется создавать I ее вручную. Однако иметь представление о требованиях к текстовым файлам с уникодом нужно, так как потенциально их несоблюдение может быть источником ошибки, понять причину которой будет просто невозможно.

Особенностью импортируемых ХМL-файлов является то, что вы не можете изменить их кодировку, просто поменяв значение в соответствующем теге. Это связано с тем, что Flash-плейер определяет кодировку внешних XML-файлов точно так же, как и простых текстовых: по значению метки ВОМ.

Импорт данных в 8-битных кодировках. Свойство System.useCodepage
Одним из наиболее часто задаваемых вопросов на форумах для флешеров является 'следующий:

«Почему при подрузке текста на мою страничку он отображается не положенными буквами, а какими-то "крякозябликами"?». Ответ на него имеется |во всех FAQ, однако его продолжают задавать с удивительным упорством.

Причина описанной проблемы достаточно банальна. Flash-плейер умеет работать (Только с текстами в уникоде. Поэтому все внешние текстовые или XML-файлы, из [которых поступает информация, должны быть сохранены в одном из поддерживаемых форматов Unicode. Если же поступившие данные являются текстом в одной из S-битных кодировок, то плейер, не найдя ВОМ, ин-терпретирует его исходя из формата UTF-8. Естественно, что позиции символов в одной из русских кодировок и UTF-8 не совпадут, и вместо осмысленного текста в поле будет отображен набор знаков из какого-нибудь датского алфавита.

Если вы принципиально не желаете (или ленитесь) переводить данные во внешних файлах в уникод, то можно сделать шаг назад (к Flash 5) и отключить в плейере его поддержку. Для этого в самом начале сценария фильма необходимо присвоить специальному свойству объекта System.

useCodepage значение true:
System.useCodepage=true; // He видать нам больше иероглифов...

Набрав такую строку, вы заставите плейер интерпретировать текстовую информацию исходя из используемой операционной системой кодовой страницы. Возвращение к 8-битовой кодировке чревато многими проблемами, ради решения которых и был создан уникод. Так, американские посетители вашего сайта увидят «такие же «крякозяблы», от которых вы избавились, использовав описанное свойство. Также вы не сможете добавить в текст символы оформления, такие как, например, смайлики. В общем, лучше не лениться и сохранять все внешние текстовые файлы в уникоде.

Свойство System.useCodepage может быть использовано в фильме лишь единожды. Вы не можете указать плейеру, что какое-то текстовое поле должно интерпретироваться как содержащее текст в уникоде, а какое-то — как отображающее данные в 8-битовой кодировке. Используемая кодировка едина для всех фильмов, проигрывающихся в плейере. Попытка же ее динамического изменения чревата самыми непредсказуемыми последствиями.

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела Action Script на эту тему:
Клипы (тип movieclip)
Основные понятия
Синтаксис ActionScript
Тип undefined
Числа (тип number)