加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-17 03:31:28 所属栏目:百科 来源:网络整理
导读:我正在使用外部C lib进行一些HTTPS通信并提供 XML服务器响应.在服务器端,响应通过ISO-8859-15编码,我得到一个std :: string,表示API的响应.当我打印出来/将其写入文件时,它看起来是正确的. 必须将std :: string和int错误代码传递给我的外部调用者.所以我在结
我正在使用外部C lib进行一些HTTPS通信并提供 XML服务器响应.在服务器端,响应通过ISO-8859-15编码,我得到一个std :: string,表示API的响应.当我打印出来/将其写入文件时,它看起来是正确的.

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

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

不幸的是,我必须在std :: c_str()的帮助下将std :: string响应转换为const char * C风格的字符串表示.原因:我的调用者是一个Ruby脚本,它利用Ruby FFI与我的C lib进行通信,这里的interlanguage类型转换是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??

事实上,字符串至少包含换行符,回车符和制表符,可能更多.

我尝试:在Ruby端强制编码字符串为ASCII-8BIT,ISO-8859-15和UTF-8,没有变化.
我尝试在C端使用base64编码,然后将字符串放入结构中,使用this code在Ruby端进行base64解码,不做任何更改.

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

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

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

问候
费利克斯

解决方法

一旦std :: string超出范围,c_str()返回的值就会被销毁.
如果您打算将此值传递给脚本,则应分配内存并将字符串复制到新分配的空间中.请参阅此示例: 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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读