简述一下今天遇到的问题:
在我的代码里面有如下代码段:
<code><span><span><?php </span> header(<span>"Content-type:text/html;charset=utf8"</span>); <span>echo</span> rtrim(<span>"威、"</span>,<span>"、"</span>);</span></span></code>
本来的预想是输出“威”。然而事与愿违,输出了几个乱码。这是为什么呢?容我细细道来。
首先要知道rtrim函数的功能,它的第二个参数是一个string,其中的每个char都会被拿出来作为将要被去除的字符。比如这样:
<code><span><span><?php </span><span>echo</span> rtrim(<span>"blakefezabc"</span>, <span>"cab"</span>); <span>//output blakefez</span></span></span></code>
是的,输出结果是blakefez。
这个函数的实现应该也比较简单:
①、从第一个参数的最后一个字符开始向左遍历,判断该字节是否在第二个参数中。
②、如果存在则去掉该字节,继续第一步。如果不存在,则结束。
请注意,我上面用的是字节。是的,这个函数是非multibyte-safe的函数。也就是说,当我们的参数中有些字符是多字节的,那么就会产生不想要的结果。比如一开始说的rtrim(“威、”, “、”)。由于”威”和”、”都是utf8编码的。也就是多字节字符。其中,”威”的编码是0xE5 0xA8 0x81,”、”的编码是0xE3 0x80 0x81,所以,在rtrim函数眼里,它看到的是:rtrim(“0xE5 0xA8 0x81 0xE3 0x80 0x81”, “0xE3 0x80 0x81”);所以最后输出的结果就是0xE5 0xA8,这时候再转换为utf8编码,就变成乱码啦。
以上就介绍了 rtrim函数的一个坑,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。