Обработка строки Unicode в версиях Delphi <= 2007

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

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

 Uwe Raabe20 дек. 2008 г., 12:05
А как насчет Utf8ToAnsi и AnsiToUtf8, расположенных в system.pas?

Ответы на вопрос(5)

но выполнимо. Я бы разделил это на 3 задачи.

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

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

 mghie20 дек. 2008 г., 17:00
Зачем нужна поддержка UTF-16 в базе данных? UTF-8 будет гораздо лучше подходить для программы Ansi Delphi, которая, скорее всего, будет использовать функции преобразования системы для Ansi <-> UTF-8.
 Jeroen Wiert Pluimers15 окт. 2009 г., 14:23
Используйте WideString (без учета ссылок, с интенсивным COM) для UTF-16. Используйте TUtf8String / string (подсчет ссылок, с подсветкой) для UTF-8, убедитесь, что вы делаете что-то вроде «type TUtf8String = type string;» сделать TUtf8String отличным, но совместимым со строкой.

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

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

го выпуска).

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

Используйте widestring в качестве основного типа данных строки.

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

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

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

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

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

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

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

WideString и функции кодирования в / из utf8 (UTF8Encode / UTF8Decode)

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

 mghie20 дек. 2008 г., 16:35
Если OP действительно знает об ограничениях такой поддержки Unicode, и все рассматриваемые строки в кодировке UTF-8 могут быть преобразованы в текущую системную кодировку и из нее без потери информации, тогда этот ответ неверен.
Решение Вопроса

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

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

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

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

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

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

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

 Arnaud Bouchez27 нояб. 2010 г., 18:39
До Delphi 2009 года, если вы назначите WideString в строку, у вас будет автоматическое преобразование из Unicode в string = AnsiString с текущей кодовой страницей процесса. Utf8Decode / Utf8Encode необходимы, если вы хотите использовать UTF-8 вместо текущей кодовой страницы для хранения sintr.
 Jessica Brown22 янв. 2012 г., 19:07
Эта ссылка на JCL устарела. Являетсяwiki.delphi-jedi.org/index.php?title=JEDI_Code_Library текущий эквивалент?

Ваш ответ на вопрос