用于Ruby FFI接口的从字符串转换为const char *时的C字符编码
我正在使用外部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,没有变化. 我有无数的训练使用Iconv转换字符串,没有变化. 我还尝试从字符串中删除不可打印的字符,然后将其放入结构中,但我没有成功. 我不知道这里发生了什么,没有选择. 问候 解决方法
一旦std :: string超出范围,c_str()返回的值就会被销毁.
如果您打算将此值传递给脚本,则应分配内存并将字符串复制到新分配的空间中.请参阅此示例: http://www.cplusplus.com/reference/string/string/c_str/ 您还应确保ruby脚本正确释放内存. 我认为这是在那里解释的:https://github.com/ffi/ffi/wiki/Examples. 从C传递给Ruby的结构示例: (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |