Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Улучшение работы с текстом в Delphi: создание надежной UDF для Firebird с UTF8 и сортировкой UNICODE_CI_AI

Delphi , Базы данных , Interbase

В статье мы рассмотрим процесс создания пользовательской функции (UDF) в среде разработки Delphi для работы с базами данных Firebird, которая будет обрабатывать строки в кодировке UTF8 с сортировкой UNICODE_CI_AI. Основная задача UDF - удаление из строки определённых символов, таких как пробел, точка, запятая, скобки и другие знаки пунктуации.

Проблема и её контекст

Разработчики столкнулись с проблемой при создании UDF в Delphi 10 Seattle для базы данных Firebird 2.5. Необходимо было удалить определённые символы из строкового поля, использующего кодировку UTF8 и сортировку UNICODE_CI_AI. Созданная функция работала корректно для символов с ASCII-кодом меньше или равным 127, но при работе с символами, имеющими больший ASCII-код, функция давала сбой.

Исходный код функции

unit UDFs;
interface
uses ib_util;
function UDF_RemovePunctuations(InputString: PAnsiChar): PAnsiChar; cdecl;
implementation
uses SysUtils, AnsiStrings, Classes;
function UDF_RemovePunctuations(InputString: PAnsiChar): PAnsiChar;
const
  PunctuationChars = [' ', ',', '.', ';', '/', '\', '''', '"','(', ')'];
var
  I: Integer;
  S, NewS: String;
begin
  S := UTF8ToUnicodeString(InputString);
  for I := 1 to Length(S) do
  begin
    if not CharInSet(S[I], PunctuationChars)
    then
      if S[I] <= #127
      then NewS := NewS + S[I];
  end;
  Result := ib_util_malloc(Length(NewS) + 1);
  NewS := NewS + #0;
  AnsiStrings.StrPCopy(Result, NewS);
end;
end.

Подход к решению

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

Исправленный код функции

function UDF_RemovePunctuations(InputString: PAnsiChar): PAnsiChar;
const
  PunctuationChars = [' ', ',', '.', ';', '/', '\', '''', '"','(', ')', '-', '+', ':', '<', '>', '=', '[', ']', '{', '}'];
var
  I: Integer;
  S: Utf8String;
begin
  S := InputString;
  for I := Length(S) downto 1 do
    if CharInSet(S[I], PunctuationChars)
    then Delete(S, I, 1);
  Result := ib_util_malloc(Length(S) + 1);
  AnsiStrings.StrPCopy(Result, AnsiString(S));
end;

Результат

Исправленная функция теперь корректно обрабатывает строки в UTF8, удаляя из них знаки пунктуации, и возвращает результат в виде строки, подготовленной для использования в базе данных Firebird.

Заключение

При работе с UDF для Firebird в Delphi важно учитывать кодировку и тип данных строк. Использование Utf8String вместо String и отказ от несоответствующих конвертаций позволили достичь желаемого результата. Это решение было подтверждено и принято сообществом как рабочее и эффективное.


Примечание: В статье использован пример кода на языке Object Pascal, который является основным для разработки в среде Delphi.

Создано по материалам из источника по ссылке.

В статье описывается процесс создания и исправления пользовательской функции (UDF) в Delphi для работы с базой данных Firebird, которая обрабатывает строки в UTF8 и сортировке UNICODE_CI_AI, предназначенной для удаления определенных символов пунктуации.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Interbase ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-03-14 09:51:17/0.0034739971160889/0