2009 г.
Delphi и кодировка Unicode
Часть I: Что такое кодировка Unicode, почему она необходима и как работать с ней в Delphi
Nick Hodges, Embarcadero
Перевод: Виктор Роднев, www.interface.ru
Оригинал: Delphi in a Unicode World Part I: What is Unicode, Why do you need it, and How do you work with it in Delphi?
Наверх
Введение
Интернет ломает географические барьеры, обеспечивая возможность распространения программного обеспечения по всему миру. В результате приложения больше не могут использоваться в среде на основе одной только кодировки ANSI. В мире кодировка Unicode была воспринята как стандартное средство передачи текста и данных. Так как ею поддерживается фактически любая система письма в мире, текст в кодировке Unicode теперь является нормой в глобальном научно-техническом сообществе.
Что такое кодировка Unicode
Кодировка Unicode представляет собой схему кодировки символов, которая позволяет кодировать практически все алфавиты в виде одного набора символов. Кодировка Unicode позволяет компьютерам представлять текст для большинства систем письма в мире и обращаться с ним. Разработка кодировки Unicode поддерживается организацией Unicode Consortium и кодифицируется как стандарт. Проще говоря, кодировка Unicode представляет собой систему, позволяющую каждому использовать любые другие алфавиты. Представьте себе, существует даже версия Unicode клингонского языка.
Данная серия статей не предназначается для того, чтобы дать полное и точное изложение того, что представляет собой код Unicode и как он работает; ее предназначение - объяснить, как использовать кодировку Unicode в Delphi 2009. В данной статье, первой из трех, будет объяснено, почему так важна кодировка Unicode, и как в Delphi будет реализован новый тип строки UnicodeString.
Преимущества кодировки Unicode
Среди многих новых функциональных возможностей, которые можно обнаружить в Delphi 2009, имеется полная поддержка кодировки Unicode всем продуктом. Тип строки по умолчанию в Delphi - теперь строка в кодировке Unicode. Так как система Delphi в значительной степени построена на языке Delphi, интегрированная среда разработки, компилятор, библиотеки RTL и VCL - все они полностью поддерживают кодировку Unicode.
Переход на кодировку Unicode в Delphi вполне естественен. ОС Windows сама по себе полностью поддерживает кодировку Unicode, так что даже естественно, что приложениями, созданными для нее, строка Unicode используется как тип строки по умолчанию. И преимущества для разработчиков на Delphi не исчерпываются только возможностью использовать такой же тип строки, как и в Windows.
Добавление поддержки кодировки Unicode дает большие возможности разработчикам на Delphi. Разработчики на Delphi могут теперь считывать, записывать, принимать, создавать, отображать и обрабатывать данные в кодировке Unicode - и все эти возможности встроены прямо в продукт. Приложения, только с небольшими или, в некоторых случаях, нулевыми изменениями можно подготовить к поддержке любых данных самого разработчика, клиентов и пользователей. Приложения, возможности которых ранее ограничивались данными в кодировке ANSI, теперь можно легко приспособить для обработки почти любого набора символов в мире.
Разработчики на Delphi смогут теперь обслуживать глобальный рынок, разрабатывая свои приложения, даже если они не будут делать ничего специально для локализации или интернационализации своих приложений. ОС Windows сама по себе поддерживает много различных локализованных версий, и приложения Delphi должны иметь возможность адаптации и работы на компьютерах, на которых установлено большое число языковых настроек, поддерживаемых Windows, включая японскую, китайскую, греческую или русскую версии Windows. Пользователи программного обеспечения могут вводить в приложение текст или использовать имена путей не в кодировке ANSI. Приложения на основе кодировки ANSI в таких случаях не всегда работали бы так, как необходимо. Приложения Windows на основе Delphi с полной поддержкой Unicode смогут работать и в таких ситуациях. Даже если приложение не переведено на какие-либо другие разговорные языки, приложение, тем не менее, сохраняет нормальную работоспособность - независимо от языковой версии системы конечного пользователя.
Что касается существующих приложений Delphi на основе кодировки ANSI, то возможность локализации приложений и их распространения на рынке приложений с поддержкой Unicode в перспективе очень велика. И если необходимо локализовать приложения, среда Delphi позволяет сделать это очень просто, особенно непосредственно во время разработки. Интегрированная среда перевода (ITE) позволяет переводить, компилировать и развертывать приложение непосредственно в интегрированной среде разработки IDE. Если необходимы услуги по переводу извне, среда IDE позволяет экспортировать проект в такой форме, которая может использоваться переводчиками вместе с развертываемым приложением External Translation Manager (Диспетчер внешних переводов). Данный инструментарий работает вместе со средой Delphi IDE, и для среды Delphi, и для среды C++Builder, позволяя локализовать приложения при согласованном и простом управлении процессом.
Кодировка Unicode широко распространена в мире, и теперь разработчики на Delphi могут стать его частью естественным и органичным образом. Таким образом, если необходима возможность обработки данных в кодировке Unicode или есть стремление продавать приложения на растущих глобальных рынках, можно делать это с помощью Delphi 2009.
Немного о терминологии
Кодировка Unicode подразумевает использование некоторых новых терминов. Например, понятие "символ" в системе понятий Unicode менее точно, чем то, к которому, по-видимому, привыкли разработчики. Для кодировки Unicode более точным термином является "элемент кода". В Delphi 2009 размер SizeOf(Char) = 2, но даже и это не всегда. В зависимости от кодировки, это значение для данного символа может принимать значение больше двух байтов. Такие последовательности называются "суррогатными парами". Итак, элемент кода представляет собой уникальный код, назначенный элементу, определенному организацией Unicode Consortium (Unicode.org). Чаще всего это то же самое, что "символ", но не всегда.
Еще один термин, который относится к кодировке Unicode - маркер порядка байтов (BOM), и это очень короткий префикс, используемый в начале текстового файла, чтобы указать тип кодировки, используемый для данного текстового файла. Новый класс TEncoding (будет рассмотрен в части II) содержит метод класса GetPreamble, который возвращает маркер порядка байтов для заданной кодировки.
Теперь, после всех объяснений, рассмотрим, как в Delphi 2009 реализуется строка Unicode.
Новый тип UnicodeString
Тип строки по умолчанию в Delphi - новый тип UnicodeString. По умолчанию, тип UnicodeString имеет сходство с кодировкой UTF-16, той же самой, что используется в ОС Windows. В этом заключается отличие от предыдущей версии, в которой типом по умолчанию был тип AnsiString. Раньше в библиотеке Delphi RTL для обработки данных в формате Юникод использовался тип WideString, но этим типом, в отличие от типа AnsiString, не подсчитывалось количество ссылок, и поэтому он не являлся для разработчиков на Delphi строковым типом по умолчанию.
Для Delphi 2009 был разработан новый тип UnicodeString, который объединяет возможности типов AnsiString и WideString. Строка UnicodeString может содержать как символы Unicode, так и символы ANSI. (Необходимо заметить, что будут сохранены типы AnsiString и WideString.) Типы Char и PChar будут преобразованы соответственно в типы WideChar и PWideChar. Следует также заметить, что не были исключены никакие типы строк. По-прежнему сохраняются и доступны для использования все использовавшиеся разработчиками типы.
Однако в Delphi 2009 тип string по умолчанию эквивалентен типу UnicodeString. Кроме того, тип Char по умолчанию - тип WideChar, а тип PChar по умолчанию - PWideChar.
То есть для компилятора задается следующий код:
type
string = UnicodeString;
Char = WideChar;
PChar = PWideChar;
Присвоение типа UnicodeString совместимо со всеми другими типами строк, однако присвоения между AnsiStrings и UnicodeStrings будут вызывать соответствующие преобразования типов. Таким образом, присвоение типа UnicodeString типу AnsiString может привести к потере данных. То есть если строка UnicodeString содержит данные со старшими байтами, преобразование такой строки в строку AnsiString приведет к потере старших байтов данных.
Важно отметить, что новый тип UnicodeString имеет те же возможности, что и другие типы строк (за исключением, конечно, возможности содержать данные в кодировке Юникод). По-прежнему можно добавлять к ним любые строковые данные, индексировать их, объединять их знаком "+" и так далее.
Например, экземпляры строки UnicodeString все так же позволяют индексировать символы. Рассмотрим следующий код:
var
MyChar: Char;
MyString: string;
begin
MyString := "This is a string";
MyChar := MyString[1];
end;
Переменная MyChar будет содержать символ, находящийся на первой позиции индекса, то есть "T". Функциональное содержание данного кода никак не изменилось. Аналогично, при обработке данных в кодировке Unicode:
var
MyChar: Char;
MyString: string;
begin
MyString := "世界您好";
MyChar := MyString[1];
end;
Переменная MyChar будет содержать символ, находящийся на первой позиции индекса, то есть "世".
Библиотека RTL содержит вспомогательные функции, которые позволяют пользователям выполнять явные преобразования кодовых страниц и размеров элементов. Если пользователь применяет функцию Move для массива символов, он не в состоянии учитывать размер элементов.
Как можно предположить, данный новый тип строки приводит к отличиям от существующего кода. В кодировке Unicode один символ больше не представляется одним байтом. Более того, один символ не всегда означает даже два байта. В результате, возможно, придется внести некоторые изменения в существующий код. Однако ведется очень серьезная работа над тем, чтобы упростить такой переход, и есть уверенность, что его можно осуществить и продолжить работу достаточно быстро. В частях II и III этой статьи будет продолжено обсуждение нового типа UnicodeString , будет рассказано о некоторых новых функциях библиотеки RTL с поддержкой Юникода, а также о специфических средствах написания программ, которые могут понадобиться при программировании. Данная серия статей призвана помочь перейти на кодировку Unicode просто и без лишних усилий.
Заключение
После добавления к среде Delphi поддержки кодировки Unicode как строки по умолчанию стало возможным принимать, обрабатывать и отображать фактически любые существующие в мире алфавиты или кодовые страницы. Приложения, создаваемые в среде Delphi 2009, будут способны принимать, отображать и обрабатывать текст в кодировке Unicode с достаточной простотой, и они будут работать гораздо лучше в любой языковой версии ОС Windows. Разработчики на Delphi смогут теперь с легкостью локализовать и переводить свои приложения, чтобы выйти на рынки, появиться на которых ранее им было гораздо сложнее. Теперь приложения Delphi могут функционировать везде в мире, где необходима поддержка Unicode.
В Части II будут рассмотрены изменения и обновления библиотеки Delphi Runtime Library, которые упрощают работу со строками в кодировке Unicode.
Наверх