Функция преобразование char * в UTF8String в DLL

Форум для изучающих FPC и их учителей.

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

Функция преобразование char * в UTF8String в DLL

Сообщение Branntweiner » 09.08.2015 21:38:20

Добрый вечер, форумчане.

Уже длительное время мучаюсь с написанием функции для преобразования char * из С/С++ в FreePascal'вский UTF8String. И каждый раз терплю неудачу, бросаю это дело, а затем снова начинаю и все безрезультатно. Вот и решил обратиться за помощью.

Если кратко, есть потрясающая библиотека, написанная на паскале, называется - ZenGL. Библиотека эта кроссплатформенная, и очень шустро рисует на Linux. С паскалем я увы знаком не сильно, школьная программа да и только, изучаю я сейчас С/С++. В общем, все функции в либе принимают в качестве аргументов значения типа UTF8String, и дабы не переделывать всю библиотеку решил запилить функцию для конвертирования из char. Почитал Вики и справку по встроенным функциям, вроде разобрался, пишу функцию, компилю библиотеку, подключаю к своему проекту, проект компилится без ошибок, но при запуске крашится. Уже не знаю, что и где копать, голова кипит. Может кто писал уже библиотеки на паскале для последующего использования с другими языками программирования, поделитесь опытом.

Привожу свою последнюю версию функции, строго не судите со строками в паскале так и не разобрался как следует, их тут просто тьма какая-то:
Код: Выделить всё
function util_PCharToUTF8String(some_text : PChar) : UTF8String;
var
  temp_utf8string : unicodestring;
begin
  DefaultAnsi2UnicodeMove(some_text, temp_utf8string, StrLen(some_text));
  Result := UTF8Encode(temp_utf8string);
end
Branntweiner
незнакомец
 
Сообщения: 8
Зарегистрирован: 09.08.2015 20:57:27

Re: Функция преобразование char * в UTF8String в DLL

Сообщение Vadim » 10.08.2015 03:35:47

Branntweiner писал(а):temp_utf8string : unicodestring;

Что бы это значило? ;-)

У Вас char * в какой кодировке?
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Функция преобразование char * в UTF8String в DLL

Сообщение SSerge » 10.08.2015 05:37:53

Branntweiner
ага, и компилятор какой?
А то у 2.6.х и 2.7-3.х поведение в отношении строк с кодировками разное
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: Функция преобразование char * в UTF8String в DLL

Сообщение Branntweiner » 10.08.2015 20:16:03

Vadim писал(а):Что бы это значило? ;-)

У Вас char * в какой кодировке?


Согласен, выглядит глупо, просто перепробовал много всего, это лишь одна из кривых версий. Char в кодировке ANSI по умолчанию. Компилятор версии 2.6.4.
Branntweiner
незнакомец
 
Сообщения: 8
Зарегистрирован: 09.08.2015 20:57:27

Re: Функция преобразование char * в UTF8String в DLL

Сообщение sts » 11.08.2015 00:46:28

util_PCharToUTF8String в Cях вызываете?
sts
постоялец
 
Сообщения: 431
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Re: Функция преобразование char * в UTF8String в DLL

Сообщение Branntweiner » 11.08.2015 00:49:05

sts писал(а):util_PCharToUTF8String в Cях вызываете?

Да.

Пока штудировал справку, накатал еще одну нерабочую функцию, надеюсь движусь в нужном направлении.
Код: Выделить всё
function util_PCharToUTF8String(some_text : PChar) : UTF8String;
var
  temp_ansi : ansistring;
begin
  SetString(temp_ansi, some_text, strlen(some_text));
  Result := AnsiToUtf8(temp_ansi);
end;
Branntweiner
незнакомец
 
Сообщения: 8
Зарегистрирован: 09.08.2015 20:57:27

Re: Функция преобразование char * в UTF8String в DLL

Сообщение sts » 11.08.2015 00:57:03

чтото я сомневаюсь что так стоит делать, строки в паскале, сложный тип, как его передача в окружение си и повторная в паскаль повлияет на целостность данных неопределенно
приведите пример - кусок хеадера (*.h) где описаны функции, и pas, где они импортятся, пару штук со строками.

Добавлено спустя 15 минут 7 секунд:
кстати, судя по примерам у них есть u_CopyUTF8Str
sts
постоялец
 
Сообщения: 431
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Re: Функция преобразование char * в UTF8String в DLL

Сообщение Branntweiner » 11.08.2015 01:13:52

sts писал(а):чтото я сомневаюсь что так стоит делать, строки в паскале, сложный тип, как его передача в окружение си и повторная в паскаль повлияет на целостность данных неопределенно
приведите пример - кусок хеадера (*.h) где описаны функции, и pas, где они импортятся, пару штук со строками.


Библиотеку гружу динамически с помощью LoadLibraryEx, потом гружу функции GetProcAddress, большинство функций, включая callback'и отлично работают, проблема только со строками. В библиотеке, где объявляются экспортируемые функции просто добавил cdecl.
например
Код: Выделить всё
function util_PAnsiCharToUTF8String(some_text : PChar) : UTF8String; cdecl;

Мне совсем не нужна конвертация в обеи стороны, в библиотеке переменные только для чтения, не изменяю их никак, просто нужна рабочая функция на паскале которая берет char * и переводит в UTF8String, который я уже могу передавать в функции библиотеки, как аргумент.
Branntweiner
незнакомец
 
Сообщения: 8
Зарегистрирован: 09.08.2015 20:57:27

Re: Функция преобразование char * в UTF8String в DLL

Сообщение sts » 11.08.2015 01:17:17

а опечатался - и pas, где они экспортируются, пару штук со строками.

Добавлено спустя 2 минуты 42 секунды:
как в *.h определена util_PAnsiCharToUTF8String(some_text : PChar) : UTF8String;? в сях же нету типа UTF8String

Добавлено спустя 3 минуты 15 секунд:
Branntweiner писал(а):Мне совсем не нужна конвертация в обеи стороны, в библиотеке переменные только для чтения, не изменяю их никак, просто нужна рабочая функция на паскале которая берет char * и переводит в UTF8String, который я уже могу передавать в функции библиотеки, как аргумент.


ну ды, вам не надо, а компиляторы вполне могут генерить код который портит.
sts
постоялец
 
Сообщения: 431
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Re: Функция преобразование char * в UTF8String в DLL

Сообщение Branntweiner » 11.08.2015 01:32:54

sts писал(а):а опечатался - и pas, где они экспортируются, пару штук со строками.

Добавлено спустя 2 минуты 42 секунды:
как в *.h определена util_PAnsiCharToUTF8String(some_text : PChar) : UTF8String;? в сях же нету типа UTF8Strin

Вот полный исходник библиотеки. Ссылка.
UTF8String определяю в виде void *, а так можно привести к любому типу. Здесь роли это никакой не играет.
Branntweiner
незнакомец
 
Сообщения: 8
Зарегистрирован: 09.08.2015 20:57:27

Re: Функция преобразование char * в UTF8String в DLL

Сообщение sts » 11.08.2015 11:45:44

лень меня остановила самостоятельно адаптировать под с.
вот ктото уже провел эту работу, зацените, отпишитесь об результатах
https://github.com/goldsmile/zengl/blob ... port_c.pas

Добавлено спустя 1 минуту 5 секунд:
https://github.com/goldsmile/zengl/blob ... /ZenGL.pas
... {$IFDEF USE_EXPORT_C}...

Добавлено спустя 1 минуту 7 секунд:
наверное версию либы надо обновить
sts
постоялец
 
Сообщения: 431
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Re: Функция преобразование char * в UTF8String в DLL

Сообщение Vadim » 11.08.2015 12:04:29

Branntweiner
А если попробовать так:
Код: Выделить всё
Var
  c_str: PChar;
  temp_ansi: ansistring;

Begin
  temp_ansi:=UTF8Encode(StrPas(c_str));
  ...
End;

?
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Функция преобразование char * в UTF8String в DLL

Сообщение Branntweiner » 11.08.2015 13:22:53

sts писал(а):лень меня остановила самостоятельно адаптировать под с.
вот ктото уже провел эту работу, зацените, отпишитесь об результатах
https://github.com/goldsmile/zengl/blob ... port_c.pas

Добавлено спустя 1 минуту 5 секунд:
https://github.com/goldsmile/zengl/blob ... /ZenGL.pas
... {$IFDEF USE_EXPORT_C}...

Добавлено спустя 1 минуту 7 секунд:
наверное версию либы надо обновить

Спасибо за наводку сегодня вечером буду разбираться. Надеюсь на успех, а то уж очень крутая библиотека, а самое главное маленькая и кроссплатформенная.

Vadim писал(а):А если попробовать так:

Код: Выделить всё
Var
c_str: PChar;
temp_ansi: ansistring;

Begin
temp_ansi:=UTF8Encode(StrPas(c_str));
...
End;


?

Попробую вечером, а то на нетбуке нет паскаля.
Branntweiner
незнакомец
 
Сообщения: 8
Зарегистрирован: 09.08.2015 20:57:27

Re: Функция преобразование char * в UTF8String в DLL

Сообщение sts » 11.08.2015 14:41:23

да, на всякий случай, вдруг не заметите, там есть примеры на сях
типа этого
https://github.com/goldsmile/zengl/blob ... demo08.cpp
sts
постоялец
 
Сообщения: 431
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Re: Функция преобразование char * в UTF8String в DLL

Сообщение Branntweiner » 11.08.2015 15:12:52

sts писал(а):да, на всякий случай, вдруг не заметите, там есть примеры на сях
типа этого
https://github.com/goldsmile/zengl/blob ... demo08.cpp

Благодарю, уже заметил. Только одно смущает, в zglHeader.h указана версия 0.3.9, так что придется адаптировать под последнюю.
Branntweiner
незнакомец
 
Сообщения: 8
Зарегистрирован: 09.08.2015 20:57:27

След.

Вернуться в Обучение Free Pascal

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

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

Рейтинг@Mail.ru