当前位置: 首页 > 科技观察

PHP源码探究——trim为什么会出现乱码

时间:2023-03-13 07:12:03 科技观察

运行如下代码:$tag='Internetproducts,';$text=rtrim($tag,",");print_r($text);运行,我们可能会认为它得到的结果是一个互联网产品,实际结果是一个互联网产品。为什么会这样?原理trim函数文档stringtrim(string$str[,string$character_mask="\t\n\r\0\x0B"])该函数不是多字节函数,即中文等多字节字符characters,它会将其头部或尾部的单个字节与后面的$character_mask对应的char数组进行匹配。如果在下面的数组中,则删除,继续匹配。例如:echoltrim("bcdf","abc");//df在下面demo中string_print_char函数中显示:,由三个字节0xe30x800x81组成,character由三个字节0xe50x930x81组成。所以在执行rtrim时,会通过字节比较去掉0x81,导致***出现乱码。源码精简版demo查看PHP7的源码,然后解压出以下小demo,方便大家一起学习。其实学习PHP源码并不难,每天进步一点点。////main.c//trim////Createdby周梦康on2017/10/18.//Copyright?2017年周梦康.保留所有权利。//#include#include#includevoidstring_print_char(char*str);voidphp_charmask(unsignedchar*input,size_tlen,char*mask);char*ltrim(char*str,char*character_mask);char*rtrim(char*str,char*character_mask);intmain(intargc,charconst*argv[]){printf("%s\n",ltrim("bcdf","abc"));string_print_char("品");//e59381string_print_char("、");//e38081printf("%s\n",rtrim("互联网产品、","、"));返回0;}char*ltrim(char*str,char*character_mask){char*res;字符掩码[256];注册size_ti;int修剪=0;size_tlen=strlen(str);php_charmask((unsignedchar*)character_mask,strlen(character_mask),mask);对于(i=0;i0){i=len-1;做{if(mask[(unsignedchar)str[i]]){len--;}else{休息;}}while(i--!=0);}res=(char*)malloc(sizeof(char)*(len+1));memcpy(res,str,len);returnres;}voidstring_print_char(char*str){unsignedlongl=strlen(str);对于(inti=0;i0){i=len-1;做{如果(c[i]==p){len--;}else{休息;}}while(i--!=0);}}}else{php_charmask((unsignedchar*)what,what_len,mask);如果(模式&1){对于(i=0;i0){i=len-1;做{if(mask[(unsignedchar)c[i]]){len--;}else{休息;}}while(i--!=0);}}}}else{if(mode&1){for(i=0;i0){i=len-1;做{if((unsignedchar)c[i]<=''&&(c[i]==''||c[i]=='\n'||c[i]=='\r'||c[i]=='\t'||c[i]=='\v'||c[i]=='\0')){len--;}else{休息;}}while(i--!=0);}}}if(ZSTR_LEN(str)==len){returnzend_string_copy(str);}else{returnzend_string_init(c,len,0);}}/*{{{php_charmask*用输入填充一个256字节的字节掩码。您可以指定一个范围,如“a..z”,*它需要递增。*返回:失败/成功输入是否正确(即没有范围错误)*/staticinlineintphp_charmask(unsignedchar*input,size_tlen,char*mask){unsignedchar*end;无符号字符c;int结果=成功;memset(掩码,0,256);for(end=input+len;input=c){memset(mask+c,1,input[3]-c+1);输入+=3;}elseif((input+1=input){/*没有'left'字符*/php_error_docref(NULL,E_WARNING,"Invalid'..'-range,'..'左边没有字符");结果=失败;继续;}if(input+2>=end){/*没有“正确的”字符*/php_error_docref(NULL,E_WARNING,"无效的'..'范围,'..'右边没有字符");结果=失败;继续;}if(input[-1]>input[2]){/*顺序错误*/php_error_docref(NULL,E_WARNING,"Invalid'..'-range,'..'-rangeneedsbeincrementing");结果=失败;继续;}/*FIXME:更好的错误(a..b..c是唯一剩下的可能性吗?)*/php_error_docref(NULL,E_WARNING,"Invalid'..'-range");结果=失败;继续;}else{掩码[c]=1;}}返回结果;}/*}}}*/