Delphi XE - я должен использовать String или AnsiString? - PullRequest
12 голосов
/ 18 мая 2011

Я наконец-то обновился до Delphi XE.У меня есть библиотека модулей, где я использую строки для хранения простых символов ANSI (символы между A и U).Я на 101% уверен, что я никогда не буду использовать символы ЮНИКОД в этих местах.

Я хочу преобразовать все другие библиотеки в Unicode, но для этой конкретной библиотеки я думаю, что будет лучше придерживаться ANSI.Преимущество заключается в требовании к памяти, поскольку в некоторых случаях я загружаю очень большие файлы TXT (содержащие ТОЛЬКО символы Ansi).Недостатком может быть то, что мне приходится делать много-много типов, когда я заставляю эти библиотеки взаимодействовать с обычными (юникод) библиотеками.

Существуют некоторые общие рекомендации, показывающие, когда хорошо переходить на Unicode и когдапридерживаться Анси?

Ответы [ 6 ]

11 голосов
/ 19 мая 2011

Проблема с общими рекомендациями заключается в том, что что-то подобное может быть очень специфичным для ситуации человека.Вот ваш пример.

Тем не менее, для людей, прибегающих к помощи и прибывающим сюда, есть некоторые общие рекомендации:

  • Да, конвертировать в 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.

4 голосов
/ 18 мая 2011

Вы должны иметь возможность завершить преобразование на интерфейсе между этим устройством и его клиентами.Используйте AnsiString для внутренних целей и строковые везде, и все будет в порядке.

3 голосов
/ 18 мая 2011

В общем случае используйте AnsiString только в том случае, если важно, чтобы символы представляли собой единичные байты, в противном случае использование строки обеспечивает будущую совместимость с Unicode.

0 голосов
/ 19 мая 2011

Используйте только строки Ansi, если у вас нет времени правильно преобразовать код.Использование строк Ansi действительно только для обратной совместимости - насколько мне известно, C # не имеет эквивалента для строк Ansi.В противном случае используйте стандартные строки Unicode.Если вы заглядываете на мой веб-сайт, у меня есть целый блок строковых подпрограмм (около 5000 LOC), который работает как с Delphi 2007 (не-Uniocde), так и с XE (Unicode) только с «строковыми» интерфейсами и содержит почти всепроблемы конверсии, с которыми вы можете столкнуться.

0 голосов
/ 19 мая 2011

Используйте AnsiString явно везде в этом модуле, и тогда вы получите ошибки предупреждения компилятора (которые вы никогда не должны игнорировать) для ошибок преобразования String в AnsiString, если вы случайно обращаетесь к подпрограммам.желательно в зависимости от вашей ситуации, просто конвертировать все в UTF8.

0 голосов
/ 18 мая 2011

Вам все равно нужно проверить все библиотеки, потому что все функции Windows API в Delhpi XE заменены их unicode-аналогами и т. Д. Если вы никогда не будете использовать UNICODE, вам нужно использовать Delphi 7.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...