Кодировка символов C ++ при преобразовании строки в const char * для интерфейса Ruby FFI

Я использую внешнюю библиотеку C ++, которая выполняет некоторую связь HTTPS и обеспечивает ответ сервера XML. На стороне сервера ответ кодируется через ISO-8859-15 и я получаю std::string это представляет этот ответ из API. Когда я распечатываю / записываю в файл, это выглядит правильно.

std::string и int Код ошибки должен быть передан моему внешнему абоненту. Поэтому я возвращаю оба значения внутри структуры:

extern "C" {
struct FoobarResponse {
const char* responseText;
int returnCode;
};
}

К сожалению, я должен преобразовать std::string ответ в const char* Строковое представление в стиле C с помощью std::c_str() до. Причина: Мой вызывающий — это скрипт Ruby, использующий Ruby FFI для связи с моей библиотекой C ++, и преобразование межязыкового типа здесь — это Ruby :: string -> C :: const char *.

Интересно здесь: если я std::cout преобразованная строка после того, как я поместил ее в структуру, все еще в порядке.

Проблема: при обработке ответа сервера на стороне Ruby он не работает. Вместо оригинального ответа вроде:

<?xml version="1.0" encoding="ISO-8859-15"?>
<Foobar xmlns="http://www.foobar.com/2012/XMLSchema">
...
</Foobar>

Я получаю строку, явно содержащую непечатаемые символы, которая всегда прерывается в начале и в конце.

?O[
l version="1.0" encoding="ISO-8859-15"?>
<Foobar xmlns="http://www.foobar.com/2012/XMLSchema">
</Fo??

Фактически строка содержит разрывы строк, возврат каретки и вкладки, по крайней мере, может быть больше.

Я пытался :force_encoding строка на стороне Ruby как ASCII-8BIT, ISO-8859-15 а также UTF-8, без изменений.
Я пытался кодировать base64 на стороне C ++, прежде чем помещать строку в struct и декодировать base64 на стороне Ruby, используя этот код, без изменений.

У меня было бесчисленное количество попыток преобразовать строку, используя Iconv а также без изменений.

Я также пытался удалить непечатаемые символы из строки перед тем, как поместить ее в структуру, но мне это не удалось.

Я понятия не имею, что здесь происходит и заканчивается вариантов.
Может ли кто-нибудь указать мне правильное направление?

С уважением
Феликс

5

Решение

Значение, возвращаемое c_str() уничтожается, как только std::string выходит за рамки.
Если вы намереваетесь передать это значение в свой сценарий, вы должны выделить память и скопировать строку в только что выделенное пространство. Смотрите этот пример: http://www.cplusplus.com/reference/string/string/c_str/

Вы также должны убедиться, что скрипт ruby ​​правильно освободит память.

Я думаю, это то, что объясняется там: https://github.com/ffi/ffi/wiki/Examples.

Пример со структурой, переданной Ruby из C:
https://github.com/ffi/ffi/wiki/Examples#-structs

7

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]