Страница 1 из 2
Функция преобразование char * в UTF8String в DLL
Добавлено: 09.08.2015 20:38:20
Branntweiner
Добрый вечер, форумчане.
Уже длительное время мучаюсь с написанием функции для преобразования 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
Re: Функция преобразование char * в UTF8String в DLL
Добавлено: 10.08.2015 02:35:47
Vadim
Branntweiner писал(а):temp_utf8string : unicodestring;
Что бы это значило?

У Вас char * в какой кодировке?
Re: Функция преобразование char * в UTF8String в DLL
Добавлено: 10.08.2015 04:37:53
SSerge
Branntweiner
ага, и компилятор какой?
А то у 2.6.х и 2.7-3.х поведение в отношении строк с кодировками разное
Re: Функция преобразование char * в UTF8String в DLL
Добавлено: 10.08.2015 19:16:03
Branntweiner
Vadim писал(а):Что бы это значило?

У Вас char * в какой кодировке?
Согласен, выглядит глупо, просто перепробовал много всего, это лишь одна из кривых версий. Char в кодировке ANSI по умолчанию. Компилятор версии 2.6.4.
Re: Функция преобразование char * в UTF8String в DLL
Добавлено: 10.08.2015 23:46:28
sts
util_PCharToUTF8String в Cях вызываете?
Re: Функция преобразование char * в UTF8String в DLL
Добавлено: 10.08.2015 23:49:05
Branntweiner
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;
Re: Функция преобразование char * в UTF8String в DLL
Добавлено: 11.08.2015 00:12:10
sts
чтото я сомневаюсь что так стоит делать, строки в паскале, сложный тип, как его передача в окружение си и повторная в паскаль повлияет на целостность данных неопределенно
приведите пример - кусок хеадера (*.h) где описаны функции, и pas, где они импортятся, пару штук со строками.
Добавлено спустя 15 минут 7 секунд:
кстати, судя по примерам у них есть u_CopyUTF8Str
Re: Функция преобразование char * в UTF8String в DLL
Добавлено: 11.08.2015 00:13:52
Branntweiner
sts писал(а):чтото я сомневаюсь что так стоит делать, строки в паскале, сложный тип, как его передача в окружение си и повторная в паскаль повлияет на целостность данных неопределенно
приведите пример - кусок хеадера (*.h) где описаны функции, и pas, где они импортятся, пару штук со строками.
Библиотеку гружу динамически с помощью LoadLibraryEx, потом гружу функции GetProcAddress, большинство функций, включая callback'и отлично работают, проблема только со строками. В библиотеке, где объявляются экспортируемые функции просто добавил cdecl.
например
Код: Выделить всё
function util_PAnsiCharToUTF8String(some_text : PChar) : UTF8String; cdecl;
Мне совсем не нужна конвертация в обеи стороны, в библиотеке переменные только для чтения, не изменяю их никак, просто нужна рабочая функция на паскале которая берет char * и переводит в UTF8String, который я уже могу передавать в функции библиотеки, как аргумент.
Re: Функция преобразование char * в UTF8String в DLL
Добавлено: 11.08.2015 00:23:14
sts
а опечатался - и pas, где они экспортируются, пару штук со строками.
Добавлено спустя 2 минуты 42 секунды:как в *.h определена util_PAnsiCharToUTF8String(some_text : PChar) : UTF8String;? в сях же нету типа UTF8String
Добавлено спустя 3 минуты 15 секунд:Branntweiner писал(а):Мне совсем не нужна конвертация в обеи стороны, в библиотеке переменные только для чтения, не изменяю их никак, просто нужна рабочая функция на паскале которая берет char * и переводит в UTF8String, который я уже могу передавать в функции библиотеки, как аргумент.
ну ды, вам не надо, а компиляторы вполне могут генерить код который портит.
Re: Функция преобразование char * в UTF8String в DLL
Добавлено: 11.08.2015 00:32:54
Branntweiner
sts писал(а):а опечатался - и pas, где они экспортируются, пару штук со строками.
Добавлено спустя 2 минуты 42 секунды:
как в *.h определена util_PAnsiCharToUTF8String(some_text : PChar) : UTF8String;? в сях же нету типа UTF8Strin
Вот полный исходник библиотеки.
Ссылка.
UTF8String определяю в виде void *, а так можно привести к любому типу. Здесь роли это никакой не играет.
Re: Функция преобразование char * в UTF8String в DLL
Добавлено: 11.08.2015 10:47:56
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 секунд:наверное версию либы надо обновить
Re: Функция преобразование char * в UTF8String в DLL
Добавлено: 11.08.2015 11:04:29
Vadim
BranntweinerА если попробовать так:
Код: Выделить всё
Var
c_str: PChar;
temp_ansi: ansistring;
Begin
temp_ansi:=UTF8Encode(StrPas(c_str));
...
End;
?
Re: Функция преобразование char * в UTF8String в DLL
Добавлено: 11.08.2015 12:22:53
Branntweiner
Спасибо за наводку сегодня вечером буду разбираться. Надеюсь на успех, а то уж очень крутая библиотека, а самое главное маленькая и кроссплатформенная.
Vadim писал(а):А если попробовать так:
Код: Выделить всё
Var
c_str: PChar;
temp_ansi: ansistring;
Begin
temp_ansi:=UTF8Encode(StrPas(c_str));
...
End;
?
Попробую вечером, а то на нетбуке нет паскаля.
Re: Функция преобразование char * в UTF8String в DLL
Добавлено: 11.08.2015 13:41:23
sts
да, на всякий случай, вдруг не заметите, там есть примеры на сях
типа этого
https://github.com/goldsmile/zengl/blob ... demo08.cpp
Re: Функция преобразование char * в UTF8String в DLL
Добавлено: 11.08.2015 14:12:52
Branntweiner
Благодарю, уже заметил. Только одно смущает, в zglHeader.h указана версия 0.3.9, так что придется адаптировать под последнюю.