Delphi в мире Юникода, часть I: что такое Юникод, зачем он Вам нужен и как с ним работать в Delphi?

By: Aleg Azarousky

Abstract: В этой статье рассказывается о том, что такое Юникод (Unicode), в чем выгода для Delphi-разработчиков от использования Юникода и каким образом Юникод будет введен в Delphi 2009

    Введение

Появление Интернета уничтожило географические преграды, что сделало возможным распространение программного обеспечения по всему миру. В результате программы больше не могут основываться на чистом ANSI. Мир принял Юникод (Unicode) в качестве стандарта для передачи текста и данных. Это позволяет ввести виртуальную поддержку для любого письменного языка в мире и использование Юникода теперь – это норма в глобальной технологической экосистеме.

    Что такое Юникод?

Юникод это схема кодирования, которая позволяет виртуально закодировать все алфавиты в один набор символов. Юникод позволяет компьютерам работать с текстом, написанным практически на любом языке мира, он развивается под управлением Консорциума Юникода (The Unicode Consortium) и записан в специальный стандарт. Проще говоря, Юникод – это система, позволяющая кому угодно использовать чей угодно алфавит. Здесь, например, находится Юникод-версия Klingon.

Перед этой статьей не стоит цель дать Вам полную информацию о том, что такое Юникод и как он работает; здесь будет рассказано о том, как Вам приступить к использованию Юникода в Delphi 2009. Если Вам нужен хороший рассказ о Юникоде, то рекомендуем Вам прочесть прекрасную статью “Абсолютный минимум, который должен знать каждый разработчик ПО о Юникоде и наборах символов” (“The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)”, которую написал Joel Spolsky. Как Joel правильно отмечает: “ЭТО НЕ ТАК УЖ СЛОЖНО”. Эта статья, часть I из III, расскажет о том, почему Юникод так важен, и как в Delphi будет введен новый тип UnicodeString.

    Зачем нужен Юникод?

Среди многих новшеств, которые появятся в Delphi 2009, есть Юникод, который проходит через весь продукт. Обычная строка (string) в Delphi теперь является Юникод-строкой (Unicode-based string). С этого момента все, что связано с Delphi, а это IDE, компилятор, RTL и VCL, полностью поддерживает Юникод.

Переход Delphi к Юникоду - естественен. Сама Windows является полностью Юникод-системой, поэтому совершенно естественно, что приложения, написанные для нее, должны по умолчанию использовать Юникод-строку. Для Delphi-разработчиков есть польза не только от того, что они теперь могут использовать те же типы строк, что и Windows.

Поддержка Юникода раскрывает перед Delphi-разработчики новые возможности: они теперь могут читать, записывать, принимать, отправлять, отображать и делать все, что угодно с данными, записанными в Юникоде – все это теперь заложено в самой Delphi. Совсем немного изменив код, а в некоторых случаях и без этого, вы сможете подготовить Ваши приложения к любым данным, которыми Вы, Ваши заказчики или пользователи будут оперировать. Приложения, которые раньше могли работать только с данными, записанными в ANSI, легко могут быть изменены, чтобы работать практически с любым набором символов в мире.

Разработчики, использующие Delphi, теперь получат доступ на мировой рынок, даже если они ничего не будут делать для того, чтобы локализовать или перевести свои программы на несколько языков. Сама Windows имеет множество различных локализованных версий и приложения, созданные в Delphi, должны иметь возможность адаптироваться для работы на компьютерах с любым из множества языков, которые поддерживаются Windows, в том числе с японским, китайским, греческим или русским. Пользователи Ваших программ могут вводить не ANSI-текст или использовать не ANSI-пути и имена. Приложения, основанные на ANSI, в таких случаях не всегда работают так, как хотелось бы. Windows-приложения, созданные в Delphi с полной поддержкой Юникода, в таких ситуациях будут работать корректно. Даже если Вы не переводите свои программы на все языки, они все равно должны работать правильно в не зависимости от того, на каком языке говорит конечный пользователь.

Для существующих ANSI-приложений, созданных в Delphi, польза от локализации и выхода на мировой рынок (использующий Юникод) потенциально очень велика. И если Вы хотите локализовать Ваши приложения, Delphi позволяет очень просто сделать это прямо в ходе создания приложения (design-time). Интегрированная Среда Локализации (Integrated Translation Environment, ITE) дает Вам возможность переводить, компилировать и развертывать приложения прямо из среды разработки (IDE). Если Вам нужны внешние средства для перевода, среда разработки может экспортировать Ваш проект в той форме, которую переводчики могут использовать вместе с переносимым Внешним Менеджером Переводов (External Translation Manager). Эти средства работают с Delphi IDE как для Delphi, так и для C++Builder, что делает локализацию Ваших приложений простой и удобной.

Мир использует Юникод, и теперь разработчики, работающие с Delphi, могут легко стать его неотъемлемой частью. Таким образом, если Вы хотите иметь возможность работать с данными в формате Юникод или если Вы хотите открыть Вашим приложениям путь на развивающиеся и глобальные рынки, Вы можете сделать это, используя Delphi 2009.

    Немного о терминологии

Юникод опирается на ряд новых терминов. Например, понятие «символа» (character) для Юникода не совсем точно отражает то, что Вы привыкли под ним понимать. Для Юникода более точным является понятие «кодовая точка» (code point). В Delphi 2009 вызов SizeOf(Char) вернет 2, но это далеко не единственная особенность. В некоторых случаях, в зависимости от кодировки, символ может занимать больше двух байт. Последовательности таких символов называются “Surrogate Pairs”. Таким образом, «кодовая точка» – это уникальный код, присвоенный элементу, определенному консорциумом Юникода. Чаще всего это то же самое, что и «символ», но не всегда.

Другой термин, относящийся к Юникоду, это “BOM”, или Byte Order Mark. Это очень короткий префикс, вставляемый в начале текстового файла для описания кодировки, использованной для этого файла. На MSDN есть прекрасная статья о том, что такое BOM. Новый класс TEncoding (будет описан в части II) имеет метод GetPreamble, возвращающий BOM для заданной кодировки.

Это все, что нужно было объяснить, а теперь давайте посмотрим, как Delphi 2009 работает с Юникод-строками.

    Новый тип UnicodeString

В Delphi 2009 строковым типом по умолчанию является новый тип UnicodeString. По умолчанию UnicodeString схож с кодировкой UTF-16, той же самой, что используется в Windows. Это отличие от предыдущей версии, в которой по умолчанию использовался тип AnsiString. Раньше в Delphi RTL для обработки данных в формате Юникод использовался тип WideString, но этот тип, в отличие от AnsiString, не подсчитывал количество ссылок (not reference-counted) и поэтому не мог рассматриваться Delphi-разработчиками как строковый тип по умолчанию.

Для Delphi 2009 новый тип UnicodeString был разработан таким образом, чтобы сочетать в себе достоинства и AnsiString, и WideString. UnicodeString может содержать как Юникод-символы, так и однобайтные ANSI символы. (Имейте ввиду, что Вы по-прежнему можете использовать AnsiString и WideString). Типы Char и PChar теперь олицетворяют соответственно WideChar и PWideChar. Учтите, что ни один тип строк не исчез, все типы, которыми пользовались разработчики, по-прежнему существуют и работают точно так же, как и раньше.

Итак, в Delphi 2009 обычная строка (string) будет эквивалентна UnicodeString, обычный символ (Char) – это теперь WideChar, а указатель на него (PChar) – это PWideChar.

То есть, для компилятора задан следующий код:

type
  string = UnicodeString;
  Char = WideChar;
  PChar = PWideChar;

UnicodeString можно присвоить значение строки любого другого типа; присвоения между AnsiString и UnicodeString будут вызывать соответствующие преобразования типов. Поэтому присвоение Юникод-строки ANSI-строке приведет к потере данных, если Юникод-строка содержит не однобайтные данные, т. к. в результате преобразования типа такой строки к AnsiString произойдет потеря не однобайтных данных.

Важно понимать, что UnicodeString обладает всеми теми достоинствами, которыми обладают другие строковые типы (разумеется, за исключением очевидного плюса от возможности содержать данные в формате Юникод). Вы по-прежнему можете добавлять к ним любые строковые данные, обращаться к их элементам по индексу, соединять их символом “+” и т. д.

Например, к символу Юникод-строки можно обратиться по индексу. Рассмотрим следующий код:

 var
   MyChar: Char;
   MyString: string;
 begin
   MyString := ‘This is a string’;
   MyChar := MyString[1];
 end;

Переменная MyChar будет содержать символ из первой позиции, т. е. “T”. Действия, выполняемые этим кодом, неизменны. В том случае, если мы работаем с данными в Юникоде:

 var
   MyChar: Char;
   MyString: string;
 begin
   MyString := ‘世界您好‘;
   MyChar := MyString[1];
 end;

Переменная MyChar будет содержать символ из первой позиции, т. е. “世”.

RTL имеет дополнительные функции для скрытого преобразования кодовых страниц и размеров элементов. Если пользователь использует функцию Move для символьного массива, он может не беспокоиться о размерах элементов.

Как Вы могли догадаться, этот новый тип строки приводит к изменению существующего кода. Один символ (Char) больше не является одним байтом. Фактически один символ даже не всегда является двумя байтами! В итоге, возможно, Вам придется несколько изменить уже существующий код. Мы много работали над тем, чтобы сделать переход к новой версии как можно более простым, и уверены, что теперь Вы сможете осуществить его очень быстро. В частях II и III этой статьи рассказ о новом типе UnicodeString будет продолжен, будет рассказано о новых функциях RTL с поддержкой Юникода и о специфических приемах написания программ, которые Вам, возможно, придется использовать в своем коде. Эта статья поможет Вам перейти к Юникоду легко и безболезненно.

    Заключение

В дополнение к тому, что Юникод-строки теперь являются строками по умолчанию, Delphi теперь может принимать, обрабатывать и отображать любой алфавит или кодовую страницу в мире. Приложения, которые Вы создадите в Delphi 2009, смогут легко работать с текстом в формате Юникод практически на любом языке, который поддерживается Windows. Разработчики, использующие Delphi, теперь смогут легко локализовать и перевести свои приложения на другой язык для того, чтобы выйти на рынки, на которые они раньше могли выйти с трудом. Мир вокруг живет в Юникоде и теперь Ваши Delphi-приложения могут жить в нем.

В части II мы рассмотрим изменения в Delphi Runtime Library, которые позволят Вам легко работать с Юникод-строками.

Server Response from: ETNASC04