Geo*_*ieF 5 c++ ruby encoding ffi
我正在使用外部C++库进行一些HTTPS通信并提供XML服务器响应.在服务器端,响应通过编码ISO-8859-15,我得到一个std::string代表API的响应.当我打印出来/将其写入文件时,它看起来是正确的.
该std::string和int错误代码必须要传递给我的外部调用者.所以我在结构中返回两个值:
extern "C" {
struct FoobarResponse {
const char* responseText;
int returnCode;
};
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,我必须在之前的帮助下将std::string响应转换为const char*C风格的字符串表示std::c_str().原因:我的调用者是一个Ruby脚本,它利用Ruby FFI与我的C++ lib进行通信,这里的中间语言类型转换是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>
Run Code Online (Sandbox Code Playgroud)
我收到一个显然包含不可打印字符的字符串,它总是在开头和结尾处断开.
?O[
l version="1.0" encoding="ISO-8859-15"?>
<Foobar xmlns="http://www.foobar.com/2012/XMLSchema">
</Fo??
Run Code Online (Sandbox Code Playgroud)
事实上,字符串至少包含换行符,回车符和制表符,可能更多.
我尝试:force_encoding在Ruby方面的字符串ASCII-8BIT,ISO-8859-15并UTF-8没有改变.在使用此代码将字符串放入struct和base64解码之前,我尝试在C++端进行base64编码,没有任何更改.
我有无数的训练使用转换字符串Iconv,没有变化.
我还尝试从字符串中删除不可打印的字符,然后将其放入结构中,但我没有成功.
我不知道这里发生了什么,没有选择.有人能指出我正确的方向吗?
问菲利克斯
c_str()一旦std::string超出范围,返回的值就会被销毁.如果您打算将此值传递给脚本,则应分配内存并将字符串复制到新分配的空间中.请参阅此示例:http://www.cplusplus.com/reference/string/string/c_str/
您还应确保ruby脚本正确释放内存.
我想这就是那里解释的:https://github.com/ffi/ffi/wiki/Examples.
从C传递给Ruby的结构示例:https: //github.com/ffi/ffi/wiki/Examples#-structs