Спасибо, тему прочитал. Значит, вопрос уже подымался. Я, в отличие от Александра Ильина, всё же думаю использовать не константный piece, а pointer to array of shortchars.

Да, Делфийские строки действительно близки к идеалу. Совместимы, с pchar, неограниченная длина, любые операции, любые байты, быстрый доступ к размеру. Имхо, это тотбазовыйтип, который должен быть "вживлён" в компилятор. Проблема модулей в том, что каждый из них юзает свои типы, не совместимые с другими:

TYPE MyString = ARRAY 666 OF CHAR;

...Либо сложные объекты для поддержки того же rich text. Это уже проблема. Не понятно, зачем строки разных типов не совместимы друг с другом. Ладно, integer - скорость и высоту путать нельзя, но строка - это текст, и текст с текстом использовать можно.

> -- Цитата:
> Дык чем отличается использование SHORTCHAR строк от CHAR, в которых старший байт кода будет 0?
Как мне передать short-строку в процедуру, что расчитана на wide-строку? Создать новую строку, записать старые символы через один (чтобы чередовались с нулём)? Так это не перевод той же кирилицы в юникод. Скорее всего проверки if s[i]='Я' уже работать не будет после такого приведения. Вот и говорю, что нужно постоянно вызывать UnicodeToWin1251 и обратную.

Да, есть ли функция, обратная SHORT?

Возможно, я чего-то ещё не понял в устройстве Blackbox, так что не пинайте сильно ногами, если что

По идее выход должен быть следующим:

S: TString; // Универсальный тип строка
S.isWide: BOOLEAN; // Является строка юникодовой, или ascii
S.toWide; // Преобразовывает строку в юникод. Если уже в юникоде, то возвращает данные, иначе выполняет ConvertWin1251ToUnicode
S.toAscii; // Обратная операция. Если была юникодовая, то ConvertUnicodeToWind1251
S.Get: ARRAY OF SHORTCHAR; // Возвращает указатель на данные (POINTER TO ARRAY OF SHORTCHAR), при этом сперва вызывается toAscii
S.GetW: ARRAY OF CHAR; // Тоже самое, но с юникод вариантом
S.Set (NewValue: ARRAY OF SHORTCHAR); // Установка нового константного значения
S.SetW (NewValue: ARRAY OF CHAR); // Тоже, но юникод
S.Len: INTEGER; // Возвращает полную длину строки, исключая финальный #0
S.Assign(Destination, Source: TString); // Присваиваем значение одной строки другой. При этом они сперва приводятся к внутреннему типу первой.

Глянул, наверное используя только легальные средства, сделать не выйдет. Но это не смертельно. Если модуль будет небольшим и проверенным, то е грех и Kernel/System заюзать.