SWIG给python字符串转义

      使用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.'

日后会补上分析过程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值