Delphi в мире Юникода


         

Новый тип 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 просто и без лишних усилий.



Содержание раздела