从用于Ruby FFI接口的字符串转换为const char*时的C++字符编码

Geo*_*ieF 5 c++ ruby encoding ffi

我正在使用外部C++库进行一些HTTPS通信并提供XML服务器响应.在服务器端,响应通过编码ISO-8859-15,我得到一个std::string代表API的响应.当我打印出来/将其写入文件时,它看起来是正确的.

std::stringint错误代码必须要传递给我的外部调用者.所以我在结构中返回两个值:

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-15UTF-8没有改变.在使用此代码将字符串放入struct和base64解码之前,我尝试在C++端进行base64编码,没有任何更改.

我有无数的训练使用转换字符串Iconv,没有变化.

我还尝试从字符串中删除不可打印的字符,然后将其放入结构中,但我没有成功.

我不知道这里发生了什么,没有选择.有人能指出我正确的方向吗?

问菲利克斯

fja*_*don 7

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

  • 你会访问内存,但它会充满垃圾.这正是你所看到的. (2认同)