Обработка строки Юникода в версиях Delphi

Справочная информация: этот вопрос относится к версиям Delphi ниже 2009 (т. е. без встроенной поддержки Unicode). У меня есть спецификация, которая требует, чтобы я передал строку в кодировке Unicode через TCP-соединение, но у меня нет Delphi 2009.

вопрос есть ли одна функция или очень маленькая библиотека (мне не нужно слишком много), которую я могу использовать для кодирования одной строки в UTF-8 непосредственно перед отправкой по проводу? Как вторая часть мой вопрос: если есть кодированные строки UTF-8, отправляемые обратно в качестве ответа, я думаю, мне понадобится другая функция, чтобы вернуть ее в строковый формат Delphi. Я понимаю ограничения такой поддержки Unicode таким образом.

5 ответов


версии Delphi до Delphi 2009 do есть встроенная поддержка Unicode. The WideString тип был доступен с Delphi 4, я думаю, может быть, раньше. WideString не так хорошо, как новый UnicodeString type, но он по-прежнему содержит 16-битные символы Юникода, и вы можете ввести его в PWideChar для отправки строк в функции Unicode API. The Windows unit объявляет большинство "широких" версий функций API, и вас ничто не остановит от объявления других функций самостоятельно, если вы найдете некоторые недостающие.

чего нет в предыдущих версиях, так это поддержки Unicode в VCL. Для этого вы можете использовать TNT Unicode элементы управления. Раньше они были свободны. Похоже, есть несколько мест, где последняя бесплатная версия все еще доступна: (1), (2).

на JCL с имеет несколько единиц для работы с Unicode. Этот JclWideStrings группа в основном легкие полезные функции. The JclUnicode unit более полный, но он также включает в себя значительный ресурс для определения свойств символов всех символов Юникода.

С JCL у вас есть несколько вариантов для классов, чтобы держать списки WideString значения. Я думаю Делфи 7 С класс для этого.

не думайте, что только потому, что у вас нет Delphi 2009, Вы не можете написать Unicode программа.

если у вас WideString значение, и вы хотите закодировать его как UTF-8, затем вызовите Utf8Encode


Я создал полное приложение unicode без использования Delphi 2009 (до его выпуска).

Я использовал следующие:

  1. использовать widestring как основным типом данных string.

  2. используется компонент базы данных с поддержкой unicode (ADO также использует widestring, но я не использовал его, потому что он не обрабатывает имена полей unicode).

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

  4. У меня есть настройка виртуальной машины с другим языком, поэтому я могу протестировать версию в другой системе, которая не поддерживает мой язык.

  5. FastReport был моим инструментом отчетности, который также поддерживает Unicode.

также я использовал DIConverters из Delphi Inspiration преобразовать базу данных из ansi в UTI8 с его функциями, вы можете использовать его для преобразование из / в UTF8, и это бесплатно; -)

существует также проект с открытым исходным кодом основы Delphi, которые имеют функцию usefual для unicode.

но я думаю, если вы можете использовать D2009 для полной поддержки unicode, ваша работа будет намного проще и быстрее, потому что вы не будете использовать медленный тип данных widestring, и вы найдете, что большая часть третьей стороны предложила версию Unicode или работает сейчас над ней.


использовать типа widestring и функции кодирования в / из utf8 (UTF8Encode/UTF8Decode)

Не используйте тип строки и не используйте Ansi-функции - если вы это делаете, вы теряете информацию.


преобразование приложения pre-Delphi 2009 в unicode сложно, но выполнимо. Я разделил его на 3 задачи.

  1. во-первых, убедитесь, что ваша база данных обрабатывает строки unicode. Предпочтительно поддержка UTF-16. Убедитесь, что весь код базы данных обрабатывает widestrings правильно, и драйверы, которые вы используете, также обрабатывают это ok.
  2. преобразуйте всю свою бизнес-логику из строк в WideStrings. Очень легко пропустить некоторые, и вы не получите никаких ошибок, так как компилятор неявно преобразует widestring в string, если вы забыли какие-либо методы. Также убедитесь, что вы изменили все стандартные строковые функции на эквиваленты WideString. Этот процесс должен распространяться на любые компоненты деталей, которые вы можете использовать.
  3. заключительная часть заключается в изменении стандартных и сторонних визуальных компонентов, которые могут потребоваться для эквивалентов WideString. Это необходимо сделать там, где вы будете отображать строки, которые могут содержать символы юникода.

сверху все, что убедитесь, что ваше тестирование является тщательным и использует символы unicode, которые фактически используют высокий байт. Если вы просто тестируете с помощью латинского набора символов, вы пропустите ошибки.


Если все, что вам нужно сделать, это действительно преобразовать внутренние строки программы из системной кодировки в UTF-8 и обратно, используйте библиотечные функции, упомянутые Уве Раабе. Если вы все еще находитесь на Delphi 4 или 5 (которые не имеют этих функций), вы можете использовать функции, которые находятся в GNU gettext для Delphi.

и не позволяйте всем ответам о том, чтобы полностью WideString напугать вас-использование UTF-8 в качестве кодировки для обмена данными (вот как я понимаю ваш вопрос) должен быть возможен в обычной программе ANSI Delphi без больших проблем, пока вы имеете дело с данными, которые на 100% представимы в вашей кодировке Windows.