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

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

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

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

Сообщение java73 » 03.05.2017 12:06:01

Всем привет.
Пытаюсь пользоваться функциями из библиотеки 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 12:57:08, всего редактировалось 1 раз.
java73
постоялец
 
Сообщения: 257
Зарегистрирован: 21.11.2013 09:08:10

Re: Склонение по падежам padegUC.dll не работает

Сообщение vitaly_l » 03.05.2017 12:08:24

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

Скормите ей строки в её кодировке, иначе она не понимает слов.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Склонение по падежам padegUC.dll не работает

Сообщение java73 » 03.05.2017 12:42:56

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

Re: Склонение по падежам padegUC.dll не работает

Сообщение vitaly_l » 03.05.2017 12:46:15

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

Это нормально! Без правильной кодировки, оно - НИКОГДА не работало! Дерзайте!
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Склонение по падежам padegUC.dll не работает

Сообщение java73 » 03.05.2017 12:51:05

Ну просто в новой версии аж капсом в названии стоят UC, подразумевая, что библиотека работает с юникодом
java73
постоялец
 
Сообщения: 257
Зарегистрирован: 21.11.2013 09:08:10

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

Сообщение Снег Север » 03.05.2017 16:17:19

Раз библиотека дельфийская и юникодная, то string - это widestring. Соттветственно, в лазаре надо подправить интерфейсные модули и применять конвертацию Utf8 в Utf16.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2990
Зарегистрирован: 27.11.2007 16:14:47

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

Сообщение java73 » 03.05.2017 17:56:19

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

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


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

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

Сообщение vitaly_l » 03.05.2017 18:25:32

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

код в студию, т.к. там явные ошибки на 88 строке.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

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

Сообщение java73 » 04.05.2017 09:56:15

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 версия юникод) никакие способы преобразования форматов строк не помогают.
java73
постоялец
 
Сообщения: 257
Зарегистрирован: 21.11.2013 09:08:10

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

Сообщение vitaly_l » 04.05.2017 10:07:52

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

WinCPToUtf8 - это далеко не в UTF16, а должно быть в UTF16.
Как Вы преобразуете в UTF16? Где этот код?
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

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

Сообщение java73 » 04.05.2017 10:19:22

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

Добавлено спустя 1 минуту 11 секунд:
Я ж написал, старая версия работает. Не работает новая, которая UC
java73
постоялец
 
Сообщения: 257
Зарегистрирован: 21.11.2013 09:08:10

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

Сообщение vitaly_l » 04.05.2017 10:27:10

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

Там точно такая-же причина как в padeg.dll. Снег Север правильно написал, нужно скормить ей widestring в кодировке UTF16.
Вашего кода по переводу WinCp в UTF16 выше в примере нет, поэтому невозможно определить где именно Вы допустили ошибку.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

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

Сообщение Cheb » 05.05.2017 12:05:25

Не костыль, а костЫлище:
Код: Выделить всё
Utf8Decode(WinCPToUtf8(<строка>))


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

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

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

В третьих, WideString это говно мамонта. Заменяйте на UnicodeString.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

Рейтинг@Mail.ru