php字符编码遇到的坑之mb_strlen

  • Jesse
  • 2017-05-31 15:35:00
  • 3607

在一次开发中使用mb_strlen 获取字符串的长度,由于没有设置编码(第二个参数)

到线上后,发现mb_strlen在开发环境和线上环境所得结果不一样。

 

首先想到的是文件编码不一致:

由于我的开发环境统一设置为"UTF-8", 于是到线上查看发现该文件也是UTF-8,就郁闷了。

 

然后想到可能是服务器的apachephp配置与开发环境不一致:

果然,开发环境的php配置:default_charset = "UTF-8"

线上配置的default_charset被注释掉了。

 

所以,以后的mb类函数或者是其它编码计算函数必须设置额外的编码参数,比如mb_strlen($string, 'UTF-8');

如果没有定义默认编码,php可能会使用默认的编码:ISO-8859-1

 

解决方法:

1.确认服务器的相关配置

php配置

default_charset = "UTF-8"
[iconv]
iconv.input_encoding = UTF-8
iconv.internal_encoding = UTF-8
iconv.output_encoding = UTF-8
[mbstring]
mbstring.language = Neutral
mbstring.internal_encoding = UTF-8
mbstring.http_input = auto
mbstring.http_output = UTF-8
mbstring.encoding_translation = On
mbstring.detect_order = auto
mbstring.substitute_character = none;

注:PHP5.6以后舍弃了mbstring和iconv的相关配置,以default_charset为主


2.设置文件为统一的编码UTF-8

 

3.apache或者nginx上做相应的编码设置

 

4.php入口处定义默认编码格式

ini_set("default_charset", "UTF-8");