天天看点

PHP 源码探秘 - 为什么 trim 会导致乱码科普原理源码探究解决方案PHP7 相关源码

运行以下代码:

我们可能以为会得到的结果是<code>互联网产品</code>,实际结果是<code>互联网产�</code>。为什么会这样呢?

比如

<code>mb_</code>系列函数是以“多个字节组成的一个字符”为颗粒度来操作的,不带<code>mb_</code>则是按实际的字节数来操作的。

<code>trim</code> 函数文档

该函数不是多字节函数,也就是说,汉字这样的多字节字符,会拿其头或尾的单字节来和后面的<code>$character_mask</code>对应的char数组进行匹配,如果在后面的数组中,则删掉,继续匹配。比如:

如下面的 demo 中的函数<code>string_print_char</code>所示:

<code>、</code>由<code>0xe3 0x80 0x81</code>三字节组成,

<code>品</code>由<code>0xe5 0x93 0x81</code>三字节组成。

所以在执行<code>rtrim</code>的时候,通过字节比对,会将<code>0x81</code>去掉,导致了最后出现了乱码。

查看 PHP7 的源码,然后提炼出下面的小 demo ,方便大家一起学习,其实PHP源码的学习并不难,每天进步一点点。

如果觉得 demo 还不够清晰的,复制下来,自己执行一次吧~

C 语言基础较差的同学也不用担心,我准备后面专门写一个PHP小白学习 C 语言的系列入门短文哈。

那么我们就依葫芦画瓢,用 php 本身的多字节函数来实现下吧:

当然你也可以使用正则来做。通过上面的函数学习,单字节函数和多字节函数,你学会了吗?