SWIG给python字符串转义

xiaoxiao2021-02-28  102

      使用SWIG框架可以方便地为python提供C++实现接口。

       在使用 pickle 序列化工具时,dumps 出来的字符串保存会遇到问题:python会对字符串的转义字符用明文书写,比如回车写作\n,tab写作\t。然而C++处理时特别尴尬,需要自己再对这些自然语言形式的转义符进行处理。

     时间紧迫,先记录下来

#include <Python.h> #include <string.h> #include <stdio.h> #include <stdlib.h> PyObject *my_escape2(char *in){ //char *in=NULL; //in = PyString_AsString(pin); int k,L=strlen(in); char *pi=in; char *out= (char *)malloc( strlen(in)+1 ); //output char *po=out; //printf("in=%s.\n",pi); while( *pi !='\0'){ *po = *pi; if( *(pi+1) !='\0' && *pi == '\\'){ char v=*(pi+1); switch(v){ case 'n':*po='\n'; pi+=2;break; case 't':*po='\t'; pi+=2;break; case '\\':*po='\\'; pi+=2;break; case '\'':*po='\''; pi+=2;break; case '\"':*po='\"'; pi+=2;break; case 'b':*po='\b'; pi+=2;break; default: *po = *pi;pi++; } }else pi++; po++; } *po = '\0'; //printf("ot=%s.\n",out); PyObject *str=PyString_FromString(out); return str; } void my_escape(char *in, char *out){ int k,L=strlen(in); char *pi=in,*po=out; bool normal = true; while( *pi !='\0'){ *po = *pi; if( *(pi+1) !='\0' && *pi == '\\'){ char v=*(pi+1); switch(v){ case 'n':*po='\n'; pi+=2;break; case 't':*po='\t'; pi+=2;break; case '\\':*po='\\'; pi+=2;break; case '\'':*po='\''; pi+=2;break; case '\"':*po='\"'; pi+=2;break; case 'b':*po='\b'; pi+=2;break; default: *po = *pi;pi++; } }else pi++; po++; } *po = '\0'; } /*int main(){ char s[100]={'H','\\','b','l','o','\\','n','L','\\','\'','\\','\"','A','.','\0'}; char *out = (char *)malloc( strlen(s)+1 ); my_escape(s,out); printf("in=%s,in_LEN=%d,size=%d.\n",s,strlen(s),sizeof(s)); printf("ot=%s,ot_LEN=%d,size=%d.\n",out,strlen(out),sizeof(out)); for(int k=0;k<15;k++)printf("out[%d]=%c,hex=%x.\n",k,out[k],out[k]); return 0; }*/ // '(lp0\nI0\naI1\naI2\na.' 日后会补上分析过程。

转载请注明原文地址: https://www.6miu.com/read-69170.html

最新回复(0)