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