Ты прав. Нет точного аналога ShortString
, который содержит символы Unicode. Есть много вещей, которые подходят близко, в том числе WideString
, UnicodeString
и массивы WideChar
, но если вы не желаете вернуться к тому, как вы собираетесь использовать тип данных (сделайте побайтовым копии в памяти и в файлах, при этом их можно использовать во всех контекстах, можно разрешить строку), тогда ни один из встроенных типов Delphi не будет работать для вас.
WideString
завершается неудачно, потому что вы настаиваете, что длина строки должна существовать по адресу строковой переменной, но WideString
является ссылочным типом; единственное, что по его адресу, это другой адрес. Его длина находится по адресу в переменной , минус четыре. Однако это может измениться, потому что все операции этого типа должны проходить через API.
UnicodeString
терпит неудачу по той же причине, а также потому, что это тип с подсчетом ссылок; создание побайтной копии одного нарушает подсчет ссылок, так что вы получите утечки памяти, исключения из-за недопустимых операций с указателями или более тонкое повреждение кучи.
Массив WideChar
может быть скопирован без проблем, но он не отслеживает его эффективную длину и не очень часто действует как строка. Вы можете назначить ему строковые литералы, и он будет действовать так, как вы назвали StrLCopy
, но вы не можете присвоить ему строковые переменные .
Вы можете определить запись, которая имеет поле для длины и другое поле для массива символов. Это решило бы проблему длины, но все равно имело бы все остальные недостатки недекорированного массива.
На вашем месте я бы просто использовал встроенный строковый тип. Затем я написал бы функции, которые помогут перенести его между файлами, блоками памяти и собственными переменными. Это не так сложно; вероятно, намного проще, чем пытаться заставить перегрузку оператора работать правильно с пользовательским типом записи. Подумайте, сколько кода вы будете писать для загрузки и хранения ваших данных, и сколько кода вы собираетесь писать, который использует вашу структуру данных как обычную строку. Вы собираетесь написать код персистентности данных один раз , но до конца жизни проекта вы будете использовать эти строки и захотите, чтобы они выглядели и действовали как настоящие струны. Так что используйте реальные строки. «Пострадать» от неудобств, связанных с ручным созданием нужного формата на диске, и воспользоваться преимуществом возможности использования всех существующих функций библиотеки строк.