Multylanguage base

VS> А вот что с Clarion’oм делать? Ждать документирования BString? Или попробовать ее заюзать?

А чего ждать? Я, кажется, недавно описывал суть, возможности и способы использования строк этого типа. На всякий случай, напомню:

  • строки данного типа представляют собой хранилища данных в юникоде динамического размера.
  • при присваивании значения такой строке, сначала освобождается ранее занятая ею память (если уже была инициализация), после чего выделяется новый блок памяти размером, как минимум, равным удвоенной длине нового значения + 4(2 для 16-бит) байта для длины.
  • при записи нового значения в выделенную память происходит конвертация обычного ANSI-текста в юникод.
  • при считывании значения такой строки автоматом происходит обратная конвертация юникода в ANSI-текст.
  • до первого присваивания поле такого типа содержит нулевой указатель, что, впрочем, не приведет к ошибке при операции типа: Str = BStr, т.к. функции ядра по манипулированию данными в стеке корректно обрабатывают нулевые указатели.

Т.е., само по себе такое поле представляет обычный 4-байтовый указатель на сконвертированную строку. Непосредственно перед данными располагается поле длины строки в юникоде (UNSIGNED).

BSize     UNSIGNED
BStr      BSTRING

  Code
  BStr = 'Проверка'
  Peek(Address(BStr),Addr#)
  ! в Addr# - адрес первого байта строки в юникоде
  Peek((Addr#-Size(BSize)),BSize)
  ! в BSize - длина строки в юникоде
  ! Size(BStr) или Len(BStr) вернут результат = BSize/2

Хотя строки данного типа не разрешены в описании структуры записи файла, тем не менее, используя приведенную выше информацию, их можно записывать/считывать, используя обычные строки достаточной длинны. Или Memo/Blob. В принципе, в каком-то смысле возможна и корректная сортировка по таким юникод-строкам независимо от языка записанных данных, т.к. в юникоде любой символ любого языка(ну, или почти любого) имеет уникальный код.