Если бы для Delphi 2009/2010 / XE / XE2 («Unicode-версия») был «Ansi switch», вы бы просто заменили проблему, которая у вас сейчас есть, на гораздо худшие проблемы.
По этой причине не может быть переключателя. Эта идея была тщательно обсуждена, я узнал об этом из первых рук с людьми, которые приняли решение, и решение о нарушении вашего кода не было принято без должной осмотрительности. Другого пути просто не было. Чтобы сделать Delphi по-настоящему Unicode, необходимо было указать псевдоним String = UnicodeString.
Таким образом, вы должны изменить все свои String
объявления на AnsiString
и Char
на AnsiChar
, если вы хотите, чтобы в коде приложения были однобайтовые символы не-юникода и строковые типы. В большинстве вашего кода и в большинстве мест это не обязательно. Но там, где вам явно требуется обработка в байтовом размере, например, двоичные протоколы через RS232 и RS485 или двоичные форматы файлов (EDA и т. Д.), Вам необходимо изменить код.
Если вы не хотите переносить свой код самостоятельно, заплатите кому-нибудь за это. Я сам портировал огромную библиотеку научных компонентов и приложений, и мне потребовалось несколько недель, чтобы протестировать и найти все ошибки. После этого у меня была разумная современная кодовая база, которая больше не ломалась с 2009 года, когда я обновился.
Когда вы доберетесь до границы XE / XE2, вы можете столкнуться с еще большей болью, связанной с предположениями вашего кода о том, что типы указателей имеют тот же размер, что и Integer или Cardinal, что больше не соответствует действительности в Win64. Опять же, ребята из Delphi не хотят ломать ваш код, они просто следуют нормальным инженерным практикам, в этом случае Win64 диктует определенные вещи.
Почему они не изменили каждое свойство элемента управления VCL на USTRING вместо String? Почему они не заставляют каждую функцию RTL принимать и USTRING, и STRING и обеспечивать перегрузки?
Потому что нормативная разработка Delphi теперь является чисто Unicode. USTRING есть и будет частным случаем. String является нативным (нормативным) строковым типом, и на самом деле он теперь также известен как UnicodeString
.
Так получилось, что вы уже использовали псевдоним типа. Строки в Delphi 1.0 были ограничены 255 символами в длину. Когда они представили Delphi 2.0 и тип длинной строки, внутренне называемый AnsiString
, они назвали существующий общий тип String как String=AnsiString
. Когда мы добрались до Unicode, каждый компонент VCL и каждый метод VCL, который принимает строку, все еще принимает строку. Однако String теперь String=UnicodeString
.
Delphi 7 уже имеет WideString
например. Нам не нужно переходить на полпути к юникоду. Понимаете ли вы это или нет, весь мир разработки программного обеспечения теперь ожидает, что строковые типы будут в юникоде. Delphi является частью глобального явления. Интернет - это юникод. Ваша операционная система Windows 7 является чистым родным Unicode.