ord函数 php有无漏洞,php的ord函数——解决中文字符截断问题

函数是这样定义的:

int

ord(

string$string)

返回字符串 string 第一个字符的 ASCII 码值。

该函数是chr()的互补函数。

试一下: echo ord('我');

这里只能返回230, 我是以u8保存的文件并输出的, 它得到的只有230, 而230转换成hex是e6,实际上utf-8中我的编码是e68891, 它只拿到了第一个字节

echo chr(0xe6).chr(0x88).chr(0x91);

这个例子可以在utf-8的情况下输出”我“这个汉字

如果大家想了解字符编码的问题可以点这里字符编码

如果大家想查看一个汉字的gbk,utf-8,unicode各种编码方式推荐大家用Notepad++下的HEX-editor点击这里下载:

http://pan.baidu.com/s/1hquyJwo

长这样子

0818b9ca8b590ca3270a3433284dd417.png

提高逼格:

身为一个程序猿,除了是苦逼的代名词外,还是神秘的象征,偶尔装XX还是不错的。既然说到编码,

那我们就说说属于你的字吧,在utf-8编码的世界里,可不是每个人都能找到属于自己的那款哦,

‘我’的编码是三字节,分别为e6、88、91,如果把你的生日放进去能编出啥字呢,想想是不是还有点小激动,

例如你是1988-9-4出生,那对应的属于自己的三字节为e9、88、94,anyway这个规则你也可以自己定义,

爆个料,按照此方法,我的字是‘釉’,好字啊,you you 切克闹。

按照此法为啥不是每个人都有呢,那自己读下utf-8的二进制存储规则就知道了,

哈哈,还是点这里字符编码

扯了一堆没用的,其实就是希望大家发现编码的乐趣0818b9ca8b590ca3270a3433284dd417.png

自己动手:

很久以前是没有mb_substr函数的,因此带汉字的字符串截断操作处理起来很麻烦,不过现在可以直接用它。

既然我们对字符编码和ord函数有了很好的了解,自己就写个针对utf-8编码的字符串截断的函数吧。

代码很戳,有待优化,但理解起来简单,贴过去可以运行,基本场景也考虑到了,还算欣慰;

$a = "jf我们de没";

/**

* @brief

*

* @param $str 待截取的字符串

* @param $start 字符串开始位置

* @param $num 截取到多长的字符串

*

* @return

*/

function utf8_substr($str, $start, $num){

$res = ''; //存储截取到的字符串

$cnt = 0; //计数器,用来判断字符串是否走到$start位置

$t = 0; //计数器,用来判断字符串已经截取了$num的数量

for($i = 0; $i < strlen($str); $i++){

if(ord($str[$i]) > 127){ //非ascii码时

if($cnt >= $start){ //如果计数器走到了$start的位置

$res .=$str[$i].$str[++$i].$str[++$i]; //utf-8是三字节编码,$i指针连走三下,把字符存起来

$t ++; //计数器++,表示我存了几个字符串了到$num的数量就退出了

}else{

$i++; //如果没走到$start的位置,那就只走$i指针,字符不用处理

$i++;

}

$cnt ++;

}else{

if($cnt >= $start){ //acsii码正常处理就好

$res .=$str[$i];

$t++;

}

$cnt ++;

}

if($num == $t) break; //ok,我要截取的数量已经够了,我不贪婪,我退出了

}

return $res;

}

var_dump(utf8_substr($a, 3, 10)); //结果应该是你想要的

?>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值