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


         

Другие функции библиотеки RTL, связанные с кодировкой Unicode


Есть ряд других подпрограмм для преобразования строк из одной кодовой страницы в другую. В их числе:

  • UnicodeStringToUCS4String
  • UCS4StringToUnicodeString
  • UnicodeToUtf8
  • Utf8ToUnicode

Кроме того, в библиотеке RTL также появился тип RawByteString, который представляет собой тип строки, не связанный ни с какой кодировкой:   RawByteString = type AnsiString($FFFF);

Тип RawByteString позволяет передавать строковые данные для любой кодовой страницы без каких-либо преобразований последней. Он особенно полезен для подпрограмм, для которых кодировка не имеет значения, например для побайтового поиска в строке. Обычно это означает, что параметры подпрограмм, которыми обрабатываются строки без связи с их кодовыми страницами, должны иметь тип RawByteString. Тип RawByteString следует присваивать переменным как можно реже, если вообще когда-либо, так как это может привести к непредсказуемому поведению и возможной потере данных.

Как правило, присвоения типов строк совместимы друг с другом.

Например, присвоение MyUnicodeString := MyAnsiString;

будет выполнено, как и ожидалось - содержимое строки типа AnsiString будет помещено в строку типа UnicodeString. Как правило, можно присваивать один тип строки строке другого типа, и компилятор выполнит необходимые преобразования, если возможно.

Однако некоторые преобразования могут привести к потере данных, и необходимо остерегаться при перемещении из строки одного типа, которая включает данные в кодировке Unicode, в другую, тип которой не поддерживает Unicode. Например, можно присваивать тип UnicodeString строке типа AnsiString, но если строка типа UnicodeString содержит символы, которые не отображаются в активной в данный момент кодовой странице ANSI, то эти символы будут потеряны при преобразовании. Рассмотрим следующий код: procedure TForm88.Button4Click(Sender: TObject); var   U: UnicodeString;   A: AnsiString; begin   U := 'This is a UnicodeString';   A := U;   Memo1.Lines.Add(A);   U := 'Добро пожаловать в мир Юникода с использованием Дельфи 2009!!';   A := U;   Memo1.Lines.Add(A); end;

Результат выполнения этого кода, если текущая кодовая страница ОС - 1252, будет следующим: This is a UnicodeString ????? ?????????? ? ??? ??????? ? ?????????????? ?????? 2009!!

Как можно видеть, при назначении типа UnicodeString строке типа AnsiString информация теряется,  так как символы кириллицы не отображаются кодовой страницей Windows-1252. Причина такого результата - строка UnicodeString содержала символы, не представимые в кодовой странице AnsiString, эти символы были потеряны и заменены вопросительными знаками при назначении типа UnicodeString строке типа AnsiString.



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