Я использую внешнюю библиотеку 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
а также без изменений.
Я также пытался удалить непечатаемые символы из строки перед тем, как поместить ее в структуру, но мне это не удалось.
Я понятия не имею, что здесь происходит и заканчивается вариантов.
Может ли кто-нибудь указать мне правильное направление?
С уважением
Феликс
Значение, возвращаемое 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
Других решений пока нет …