[РЕШЕНО] Склонение по падежам padegUC.dll не работает

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Ответить
java73
постоялец
Сообщения: 257
Зарегистрирован: 21.11.2013 09:08:10

[РЕШЕНО] Склонение по падежам padegUC.dll не работает

Сообщение java73 »

Всем привет.
Пытаюсь пользоваться функциями из библиотеки padegUC.dll (4 версия с поддержкой юникода).
Объявление и использование беру прямо из их руководства

Код: Выделить всё

function GetFIOPadegFSAS(pFIO: PChar; nPadeg: longint; pResult: PChar;
  var nLen: longint): integer; stdcall; external
  'PadegUC.dll' Name 'GetFIOPadegFSAS';
function GetAppointmentPadeg(pAppointment: PChar; nPadeg: longint;
  pResult: PChar; var nLen: longint): integer;
  stdcall; external 'PadegUC.dll' Name 'GetAppointmentPadeg';
=============================
function TForm1.MakeCase(const ATargetStr: string; ACase: integer;
  IsAppointment: boolean): string;
var
  tmpS: PChar;
  nLen: longint;
  RetVal: integer;
begin
  Result := '';
  nLen := Length(ATargetStr) + 10;
  tmpS := StrAlloc(nLen);
  try
    if IsAppointment then
      RetVal := GetAppointmentPadeg(PChar(ATargetStr), ACase, tmpS, nLen)
    else
      RetVal := GetFIOPadegFSAS(PChar(ATargetStr), ACase, tmpS, nLen);
    if RetVal = 0 then Result := StrPas(tmpS);
  finally
    StrDispose(tmpS);
  end;
end;


Функция сама вызывается, но не работает. В возвращаемой строке идет первоначальная строка без какого-либо склонения по падежам, хоть ФИО, хоть должность.
Если кто-то пользовался и получилось - поделитесь, пожалуйста (может работает нормально старая версия, но как с юникодом поступили?)
Последний раз редактировалось java73 03.05.2017 11:57:08, всего редактировалось 1 раз.
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

java73 писал(а):как с юникодом поступили

Скормите ей строки в её кодировке, иначе она не понимает слов.
java73
постоялец
Сообщения: 257
Зарегистрирован: 21.11.2013 09:08:10

Сообщение java73 »

Вот старая библиотека padeg.dll заработала с помощью функций Utf8ToWinCP и обратно. Но это как-то костыльно выглядит)
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

java73 писал(а):Вот старая библиотека padeg.dll заработала с помощью функций Utf8ToWinCP и обратно. Но это как-то костыльно выглядит)

Это нормально! Без правильной кодировки, оно - НИКОГДА не работало! Дерзайте!
java73
постоялец
Сообщения: 257
Зарегистрирован: 21.11.2013 09:08:10

Сообщение java73 »

Ну просто в новой версии аж капсом в названии стоят UC, подразумевая, что библиотека работает с юникодом
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3067
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

Сообщение Снег Север »

Раз библиотека дельфийская и юникодная, то string - это widestring. Соттветственно, в лазаре надо подправить интерфейсные модули и применять конвертацию Utf8 в Utf16.
java73
постоялец
Сообщения: 257
Зарегистрирован: 21.11.2013 09:08:10

Сообщение java73 »

Снег Север писал(а):Снег Север » 03.05.2017 16:17:19

Раз библиотека дельфийская и юникодная, то string - это widestring. Соттветственно, в лазаре надо подправить интерфейсные модули и применять конвертацию Utf8 в Utf16.


Вот не помогает((
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

java73 писал(а):Вот не помогает

код в студию, т.к. там явные ошибки на 88 строке.
java73
постоялец
Сообщения: 257
Зарегистрирован: 21.11.2013 09:08:10

Сообщение java73 »

vitaly_l писал(а):
java73 писал(а):Вот не помогает

код в студию, т.к. там явные ошибки на 88 строке.


Вот работающий вариант. Объявление:

Код: Выделить всё

function MakeCase(const ATargetStr: string; ACase: integer;
  IsAppointment: boolean = False): string;

// подключение функций склонения ФИО и должностей
function GetFIOPadegFSAS(pFIO: PChar; nPadeg: longint; pResult: PChar;
  var nLen: longint): integer; stdcall; external
  'Padeg.dll' Name 'GetFIOPadegFSAS';
function GetAppointmentPadeg(pAppointment: PChar; nPadeg: longint;
  pResult: PChar; var nLen: longint): integer;
  stdcall; external 'Padeg.dll' Name 'GetAppointmentPadeg';

Оберточная функция:

Код: Выделить всё

function MakeCase(const ATargetStr: string; ACase: integer;
  IsAppointment: boolean): string;
var
  tmpS: PChar;
  nLen: longint;
  RetVal: integer;
begin
  Result := '';
  nLen := Length(ATargetStr) + 10;
  tmpS := StrAlloc(nLen);
  try
    if IsAppointment then
      RetVal := GetAppointmentPadeg(PChar(Utf8ToWinCP(ATargetStr)), ACase, tmpS, nLen)
    else
      RetVal := GetFIOPadegFSAS(PChar(Utf8ToWinCP(ATargetStr)), ACase, tmpS, nLen);
    if RetVal = 0 then Result := WinCPToUtf8(StrPas(tmpS));
  finally
    StrDispose(tmpS);
  end;
end;


С вариантом использования вместо padeg.dll (старая 3 версия) библиотеки padegUC.dll (4 версия юникод) никакие способы преобразования форматов строк не помогают.
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

java73 писал(а):WinCPToUtf8(StrPas(tmpS));

WinCPToUtf8 - это далеко не в UTF16, а должно быть в UTF16.
Как Вы преобразуете в UTF16? Где этот код?
java73
постоялец
Сообщения: 257
Зарегистрирован: 21.11.2013 09:08:10

Сообщение java73 »

В случае padeg.dll это не требуется.

Добавлено спустя 1 минуту 11 секунд:
Я ж написал, старая версия работает. Не работает новая, которая UC
Аватара пользователя
vitaly_l
долгожитель
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41
Контактная информация:

Сообщение vitaly_l »

java73 писал(а):Не работает новая, которая UC

Там точно такая-же причина как в padeg.dll. Снег Север правильно написал, нужно скормить ей widestring в кодировке UTF16.
Вашего кода по переводу WinCp в UTF16 выше в примере нет, поэтому невозможно определить где именно Вы допустили ошибку.
Аватара пользователя
Cheb
энтузиаст
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34
Контактная информация:

Сообщение Cheb »

Не костыль, а костЫлище:

Код: Выделить всё

Utf8Decode(WinCPToUtf8(<строка>))


библиотеки padegUC.dll (4 версия юникод) никакие способы преобразования форматов строк не помогают.

Там в объявлениях не забыли заменить PChar на PUnicodeChar ?

Вообще надо отучаться в заголовках для внешних библиотек использовать PChar. Возможны нежданчики из-за того, что этот тип теперь плавает в зависимости от настроек компиляции.
Только конкретные PAnsiChar и PUnicodeChar.

В третьих, WideString это говно мамонта. Заменяйте на UnicodeString.
Ответить