Проблема с общими рекомендациями заключается в том, что что-то подобное может быть очень специфичным для ситуации человека.Вот ваш пример.
Тем не менее, для людей, прибегающих к помощи и прибывающим сюда, есть некоторые общие рекомендации:
Да, конвертировать в Unicode.Не пытайтесь сохранить старое приложение полностью, используя AnsiString
s.Причина в том, что весь VCL является Unicode, и вам не следует пытаться смешивать их, потому что вы будете преобразовывать каждый раз, когда вы присваиваете строку Unicode строке ANSI, и это преобразование с потерями.Попытка сохранить старый способ, потому что это меньше работы (или по какой-то подобной причине), причинит вам боль;просто включите новый тип string
, преобразуйте и используйте его.
Вместо случайного смешивания двух, явно выполните любые необходимые преобразования, один раз - например, если выВы загружаете данные из старой версии вашей программы, вы знаете, что это будет ANSI, так что считайте их в строку Unicode и все.После этого это будет Unicode.
Вам не нужно менять тип ваших string
переменных - string
pre-D2009 - это ANSI, а в D2009 и alter -Unicode.Вместо этого следуйте предупреждениям компилятора и посмотрите, какие строковые методы вы используете - некоторые по-прежнему принимают параметр AnsiString
, и я нахожу все это запутанным.Компилятор сообщит вам.
Если вы используете строки для хранения байтов (другими словами, используете их как массив байтов, потому что символ был байтом), переключитесь на TBytes
.
Вы можете столкнуться с определенными проблемами для таких вещей, как шифрование (строки больше не являются байтами / символами, поэтому «символ» для «символ» вы можете получить другой вывод);чтение текстовых файлов (используйте потоковые классы и TEncoding );и, честно говоря, разные вещи.Поищите здесь на SO, большинство вопросов уже задавалось раньше.
Комментаторы, пожалуйста, добавьте больше предложений ... Я в основном использую C ++ Builder, а не Delphi, и, вероятно, довольноНесколько специфических вещей для Delphi, о которых я не знаю.
Теперь по вашему конкретному вопросу: стоит ли конвертировать эту библиотеку?
Если:
- Значения между A и U действительно только в этом диапазоне, и
- Эти значения представляют символы (A на самом деле является A, а не байтовое значение 65 - если это так, используйте TBytes), и
- Вы загружаете большие текстовые файлы, и возникает проблема с памятью
, после чего вы не конвертируете в Unicode и вместо этого переключаете string
s на AnsiString
s, имеет смысл.
Имейте в виду, что:
- Каждый раз, когда вы конвертируете из ANSI в Unicode *, возникают накладные расходы
- Вы можете использовать
UTF8String
, который является специфическим типомAnsiString
, который не будет с потерями при преобразовании и все еще будет хранить большую часть текста (латинские символы) в грехеgle byte - Изменение всех экземпляров
string
на AnsiString
может быть немного трудным, и вам нужно будет проверить все вызванные с ними методы, чтобы увидеть, выполняется ли слишком много неявных преобразований (для повышения производительности) и т. д. - Возможно, вам придется изменить внешний уровень вашей библиотеки, чтобы использовать Юникод, чтобы код преобразования или предупреждения компилятора ANSI / Юникод не были видны пользователям вашей библиотеки
- Есливы конвертируете в Unicode наборы символов (не помню синтаксис, может быть
if 'S' in MySet
?) не будет работать .Из вашего описания символов от A до U, я мог бы догадаться, что вы хотели бы использовать этот синтаксис.
Моя рекомендация? Лично, единственная причина, по которой я бы сделал это из информацииВы указали использование памяти и, возможно, производительность в зависимости от того, что вы делаете с этим огромным количеством A..U
с. Если это действительно важно, это одновременно и драйвер, и ограничение, и вам следует преобразовать его в ANSI.