zoukankan      html  css  js  c++  java
  • mbstring扩展导致中文乱码

    本文目的

    mbstring是php的一个标准扩展,源代码在php_src/ext/mbstring中。主要用于处理多字节编码的字符串,如UTF-8,GBK等。php内置的字符串处理函数(如strlen等)将字符串当作字节数组处理,如果直接用来处理中文,可能会导致中文乱码(中文编码方式可以参考这篇文章《网页中文乱码的那些事儿》)。但是,如果mbstring使用不当,也会导致乱码现象。最近就遇到这个问题,所以记录下来,作为备忘。

    乱码现象

    看看下面的代码:

    <?php
    /**
     * 清除所有常见标点符号
     */
    function clear_point($pointer) {
    	return mb_eregi_replace('[\s《》【】@#¥%、\[\],\{\}。“”]+', ' ', $pointer);
    }
    
    $str = '今天,  是个《好日 子》。“不  【是吗】';
    echo "原始字符串    :'{$str}'", PHP_EOL;
    $stripped = clear_point($str);
    echo "处理后的字符串:'{$stripped}'", PHP_EOL;

    上面的代码主要是将字符串中的标点剔除(php脚本需要使用utf-8编码),执行结果如下:

    clip_image002

    出现乱码了。

    原因&解决方法

    导致原因很简单,虽然你使用了mbstring库中的函数处理多字节字符串,但是php仍然不知道被处理的字符串是什么编码。可以使用命令”php –i | grep mbstring”来看看相关配置,如下图:

    clip_image004

    默认的mbstring.internal_encoding的值为‘no value’,说明没有明确表示php源代码是以何种方式编码,从而导致了错误的处理方式,乱码很容易发生。

    问题关键在于设置mbstring.internal_encoding,给出明确的编码规则。修改后,如下图所示(此配置在php.ini中):

    clip_image006

    修改后,再运行命令“php –i | grep mbstring”,得到如下结果,表示修改生效:

    clip_image008

    再次运行上面的程序,得到如下结果:

    clip_image010

    没有乱码,处理后的字符串将标点全部剔除。

    参考资料

  • 相关阅读:
    Math 类、Random 类、BigDecimal 类
    Redis 持久化原理及过期 key 清除策略
    MySql 存储引擎和索引
    MySql 视图、触发器以及存储过程
    布隆过滤器
    微信红包实现原理
    11-散列3 QQ帐户的申请与登陆 (25 分)
    11-散列2 Hashing (25 分)
    11-散列1 电话聊天狂人 (25 分)
    C语言实现Linux之ls
  • 原文地址:https://www.cnblogs.com/bourneli/p/2698043.html
Copyright © 2011-2022 走看看