Я унаследовал старое приложение Borland C++ Builder, которое теперь необходимо перенести в новый инструмент разработки. Предлагаемый способ пойти с Embarcadero C++ Builder
Да. На самом деле это один и тот же продукт. Borland создала дочернюю компанию под названием CodeGear для управления ее инструментами разработчика (Delphi, C++ Builder и т. Д.), А затем Embarcadero позже купила CodeGear.
Основная проблема у меня есть, что с Embarcadero C++, строка типа теперь UnicodeString вместо AnsiString (как это было в Borland C++ Builder).
string
(в нижнем регистре ы) относится к классу std::string
в STL, который до сих пор char
основанное. Вы думаете о псевдониме C++ Builder System::String
, который теперь отображается на System::UnicodeString
вместо System::AnsiString
(это изменение было внесено в C++ Builder 2009, когда было введено UnicodeString
). Однако AnsiString
все еще существует и может использоваться напрямую.
Использование Unicode в этом приложении не является вариантом - файлы, с которыми он работает, имеют формат ANSI.
Тогда не используйте UnicodeString
для их обработки. Продолжайте использовать вместо этого AnsiString
.
Модифицировать код для использования AnsiString (и тому подобное) выполнимо, но я бы предпочел, поскольку он использует множество конструкций TStringList (и подобных).
Это, с другой стороны, было бы проблемой, да. Большинство RTL поддерживает только UnicodeString
. Поэтому код, использующий TStringList
, должен быть переписан, например, с использованием TList<AnsiString>
или std::vector<AnsiString>
(если только код не использует свойства TStringList::(Comma|Delimited)Text
, и в этом случае у вас есть большая перезапись). Однако, для кода AnsiString
, многие из старых функций RTL были перемещены в отдельный блок System.AnsiStrings
, поэтому вы можете добавить #include <System.AnsiStrings.hpp>
в свой код, чтобы достичь их.
Так что мой вопрос: есть ли установка или компилятор вариант или что-то, что я могу использовать, чтобы сказать Embarcadero использовать System.AnsiString как определение для строки вместо System.UnicodeString?
Нет. И если вы подумаете об этом, это будет серьезное обязательство для их реализации. Несколько копий рамок RTL/VCL/FMX, 2 для каждой поддерживаемой платформы ОС. И много внутреннего кода должно быть IFDEF'ed для обработки различий между логикой обработки Ansi/Unicode. Таким образом, это не реально или экономически выгодно для них (и слишком поздно на этом этапе, особенно учитывая, что AnsiString
не поддерживается на мобильных платформах ОС - хотя для его повторного включения имеется сторонний патч).
Это, вероятно, долго выстрел, но RAD Studio XE (который является более старой версией, которую я позаимствовал сделать несколько тестов) документация говорит «по умолчанию, строка типа теперь строка Unicode» , что означает, что это можно изменить.
Нет, это не может быть изменено. Рамки RTL/VCL/FMX теперь Unicode. Но это не требует, чтобы ваш код также был Unicode. Только в местах, где вам необходимо напрямую взаимодействовать с RTL/VCL/FMX. Остальная часть вашего кода может продолжать использовать AnsiString
(или даже std::string
) по мере необходимости.
Нет ничего плохого в использовании' UnicodeString' для этой цели. 'UnicodeString' и' AnsiString' являются специализациями шаблона 'AnsiStringT', где параметр шаблона является кодовой страницей. –