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

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

参考资料

  • 本文转自bourneli博客园博客,原文链接:http://www.cnblogs.com/bourneli/archive/2012/09/22/2698043.html,如需转载请自行联系原作者
相关文章
|
26天前
|
C++
VS Code 中文乱码及编码格式问题全解
VS Code 中文乱码及编码格式问题全解
|
2月前
|
Java API 数据库
解决Java中文显示乱码问题的原因与方案
解决Java中文显示乱码问题的原因与方案
223 0
|
5月前
|
编解码 JavaScript 编译器
[字符编码] 实战篇:QT中文乱码的解决办法
[字符编码] 实战篇:QT中文乱码的解决办法
475 0
|
6月前
|
PHP
thinkphp 框架 GBK 编码
thinkphp 框架 GBK 编码
17 0
|
9月前
|
开发工具 git Windows
GitBash乱码解决方案
GitBash乱码解决方案
56 0
|
11月前
MobaXterm中文乱码编码问题,无需修改系统编码,GB2312
MobaXterm中文乱码编码问题,无需修改系统编码,GB2312
|
编译器 Shell Linux
VS2019 高级保存设置UTF-8编码-源代码乱码问题
VS2019 高级保存设置UTF-8编码-源代码乱码问题
898 0
VS2019 高级保存设置UTF-8编码-源代码乱码问题
|
Java
springboot全局字符编码设置(解决乱码问题)
springboot全局字符编码设置(解决乱码问题)
1213 0
springboot全局字符编码设置(解决乱码问题)
|
JSON 前端开发 Java
SpringMVC:请求乱码问题处理和json乱码解决方案
SpringMVC:请求乱码问题处理和json乱码解决方案
SpringMVC:请求乱码问题处理和json乱码解决方案
|
关系型数据库 MySQL 数据库