Обработка строки Unicode в версиях Delphi <= 2007 - PullRequest
9 голосов
/ 20 декабря 2008

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

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

Ответы [ 5 ]

26 голосов
/ 20 декабря 2008

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

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

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

С помощью JCL у классов есть несколько вариантов хранения списков значений WideString. Я думаю, что Delphi 7 даже поставляется с классом для этого.

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

Если у вас есть значение WideString, и вы хотите закодировать его как UTF-8, тогда вызовите функцию Utf8Encode. Он вернет значение AnsiString или, возможно, Utf8String, если ваша версия Delphi объявит этот тип. Однако это не то же самое, что Delphi 2009 Utf8String. Delphi 2009 будет автоматически преобразовываться в UnicodeString или AnsiString(x) и наоборот в инструкциях присваивания. Предыдущие версии имеют только один тип AnsiString, поэтому вам нужно отслеживать, какие переменные содержат данные UTF-8, а какие - данные Ansi. (Венгерская запись в именах переменных и параметров может помочь вам отслеживать.) И, конечно же, есть функция Utf8Decode для преобразования данных UTF-8 обратно в WideString.

Для обработки других кодировок символов вы должны проверить Open XML , бесплатную библиотеку XML для Delphi. Как часть обработки XML, он поддерживает преобразование между 70 различными кодировками.

6 голосов
/ 20 декабря 2008

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

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

  1. Использовать widestring в качестве типа основной строки.

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

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

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

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

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

есть также проект с открытым исходным кодом Основы Delphi , которые имеют полезную функцию для Unicode.

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

6 голосов
/ 20 декабря 2008

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

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

5 голосов
/ 20 декабря 2008

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

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

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

3 голосов
/ 20 декабря 2008

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

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

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