mb_internal_encoding php,strlen和mb_strlen函数的区别

参考文档

在使用strlen和mb_strlen这两个函数时,注意文件编码、数据库编码、浏览器编码,三码合一

strlen() 和 mb_strlen()共同点:

strlen( $str ) 和 mb_strlen( $str [,encoding ] )都是:求字符串长度的函数。

strlen不能设置编码类型;mb_strlen可以设置字符串编码类型(根据第二个参数)。

strlen() 和 mb_strlen()之间的区别:

strlen计算字符时,对utf-8中文字符是长度为3。(默认使用内部编码;如果内码使用的时gbk或gb2312那么,中文字符长度为2)

mb_strlen函数在使用时,需要加载php_mbstring.dll模块(就是在php.ini中开启extension=php_mbstring.dll),否则运行时会出现未定义函数。

mb_strlen函数,选择utf8为内码时,中文字符当作长度为1来计算。(关于mb_strlen在处理乱码,就是除了内码外的编码(文件编辑器的编码),这里使用gbk就会出现乱码)

$str = "你好a中国world!";

echo strlen( $str ), "
"; //> 19

echo mb_strlen( $str , 'utf8'); //> 11

echo mb_strlen( $str, 'gbk' ); //> 13

echo mb_strlen( $str, 'gb2312' );//> 13

echo mb_strlen( $str ); //> 默认使用内部编码(这里时utf-8) 11

?>

这里的utf8,得到预期的结果为4+7=11(4个中文+7个英文)

gbk 和 gb2312 得到13,这时什么意思???(出现了乱码)

strlen或mb_strlen在处理汉字时,出现解析错误,得到的是字符串所占的字节数。(上面的gbk和gb2312就是这种原因造成的;由于默认内部编码为utf-8,所以出现解析错误。)

这里strlen、mb_strlen默认使用的编码,就是编辑器文件的编码。

如何获取当前文件内码:

php的内置函数 mb_internal_encoding(),该函数会返回一个字符串。

echo mb_internal_encoding(); //> "UTF-8" 没有参数时,返回内部默认编码

?>

使用mb_internal_encoding($encoding)设置内部默认编码。

//> 获取文件内部默认编码

echo mb_internal_encoding(), "
";

dump( mb_internal_encoding("GB2312"), "
");

echo mb_internal_encoding();

$str = "你好中国";

echo "
", mb_strlen( $str );

运行结果:

UTF-8

bool(true)

EUC-CN

7

这里mb_strlen( $str )得到7,是由于编辑器的编码是utf-8。如果我们改掉编辑器编码为GB2312编码的到的是4。(可以知道,在没有乱码(三码合一),中文字符在被mb_strlen处理时是当做1计算。)

strlen( $str ):计算时,使用的编码以文件的编码为准(如果文件为gbk那么一个汉字为2;utf-8那么一个汉字为3)

mb_internal_encoding( [encoding] ):设置编码,默认返回true(设置成功)/false(设置失败)。

strlen()和mb_strlen()函数的组合应用:

这两个函数联合计算出一个中英文混排的串是多少(一个中文字符的占位是2,英文字符是1)

$str = "你好a中国world!";

echo (strlen( $str ) + mb_strlen( $str, 'utf8' ))/2; //>15

"你好a中国world!" 的strlen($str)是19,mb_strlen($str,'utf8')是11,"你好a中国world!"的占位是15 (4*2+7)

总结:

strlen、mb_strlen在使用时,最好设置三码合一。

如果所有的编码都是一致的,那么:

strlen获取的是字符串的内部字节。(gbk、gb2312等,一个汉字为2;utf-8,一个汉字为3。英文下的字母或符号都是为1)

mb_strlen获取的是指定编码下的字符数(前提是指定编码需要和文件编码一致)

如果文件编码和设置的编码不一致:

在使用strlen时,默认使用文件编码计算(如:文件编码为utf-8,每个汉字就为3)

mb_strlen在处理汉字会出现乱码的情况。

mb_internal_encoding([encoding]):可以设置/获取,当前文件的编码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值