详解PHP用mb_string处理windows中文字符


Posted in PHP onMay 26, 2021

我们都知道windows中(当然是中文版),文件名和文件内容等编码都是gbk,而我们在开发过程中,IDE里的编码则是UTF-8,(这里不讨论为什么等等问题,只考虑怎么把编码转变成一样的)所以导致我写的UTF-8编码的正则模式字符串中的中文在gbk编码的文件中并不能正确匹配。

一开始,我并没有什么办法,试过把PHP脚本文件的编码也改成GBK,也可以用,但是想到这种方法太low了,所以找一找PHP中有没有函数可以满足我的需求。

这时,我想到了以前在处理windows中的文件名时用的函数iconv(),其函数原型如下:

stringiconv(string$in_charset,string$out_charset,string$str)

Performsacharactersetconversiononthestringstrfromin_charsettoout_charset.

我们常使用:

$out_charset='utf-8';

$fileName=iconv($fileName,$out_charset,'gbk');

来处理文件名,将文件名改从gbk改为UTF-8而内容不变。

手册翻译附加:

  • 如果你在输出字符串$out_charset后面添加//TRANSLIT即$out_charset='utf-8//TRANSLIT',在遇到不能转换为UTF-8的字符时,程序会自动替换为一个相似字符的UTF-8字符;
  • 如果你在输出字符串$out_charset后面添加//IGNORE即$out_charset='utf-8//IGNORE',在遇到不能转换为UTF-8的字符时,程序会自动跳过这个字符。
  • 如果你什么都没加,就在遇到不能替换成UTF-8的字符时,替换会被中断。

但是,我在用这个函数处理时,结果却是这样:

详解PHP用mb_string处理windows中文字符

意思是iconv()函数能处理的最大字符数只有64,一般的文件名大小,而我的文件内容很显然不止64个字符。

没有办法,我只好再次各种翻找别的函数。

直到我发现了mb_string函数库,这个函数库一般都在PHP环境里集成,我们可以在phpinfo()里找到它。

详解PHP用mb_string处理windows中文字符

mb_string函数里有一个mb_convert_encoding()函数,可以将一个字符串的编码改变,其函数原型如下:

stringmb_convert_encoding(string$str,string$to_encoding[,mixed$from_encoding])

Convertsthecharacterencodingofstringstrtoto_encodingfromoptionallyfrom_encoding.

基原型跟iconv()函数差不多,只是它没有对输出函数的后缀修饰,它也没有对字符串长度的明确限制。

而且我们看到$from_encoding是可选的,它可以自动识别源编码。

因为找不到一个确切的无法转码的字符,也不知道它遇到无法转码的字符会怎么处理。

通过mb_convert_encoding()函数,将整个文件处理了一下,于是,问题顺利解决。

最后介绍一下mb_string函数库,它全名叫MultibyteString,它的很多方法都扩展自PHP自身的string函数库,函数名在原函数的前面加了"mb_",这些函数除了拥有原函数的作用外,还在可选参数的最后加入了一个$encoding的可选参数,这个参数可以规定函数以什么样的编码方式来处理字符串。

例如strpos()函数,找到一个字符串在另一个字符串中的位置。

strpos("欢迎来访问","问",0)返回的结果是12,因为脚本是UTF-8编码,而将字符串转为UTF-8编码后,每个中文字符会占用3个字节。

而在mb_strpos()函数中,mb_strpos("欢迎来访问","问",0,'utf-8')则会返回4,它会将字符串当作已经转UTF-8的状态执行。

而mb_strpos("欢迎来访问","问",0,'gbk')会返回6

以上就是详解PHP用mb_string处理windows中文字符的详细内容,更多关于PHP用mb_string处理windows中文字符的资料请关注三水点靠木其它相关文章!

PHP 相关文章推荐
PHP 年龄计算函数(精确到天)
Jun 07 PHP
php中将html中的br换行符转换为文本输入中的换行符
Mar 26 PHP
php上传图片之时间戳命名(保存路径)
Aug 15 PHP
Thinkphp将二维数组变为标签适用的一维数组方法总结
Oct 30 PHP
php中使用key,value,current,next和prev函数遍历数组的方法
Mar 17 PHP
PHP验证信用卡卡号是否正确函数
May 27 PHP
如何把php5.3版本升级到php5.4或者php5.5
Jul 31 PHP
非常全面的php日期时间运算汇总
Nov 04 PHP
PHP strip_tags() 去字符串中的 HTML、XML 以及 PHP 标签的函数
May 22 PHP
Laravel中七个非常有用但很少人知道的Carbon方法
Sep 21 PHP
PHP PDOStatement::getAttribute讲解
Feb 01 PHP
详解PHP变量传值赋值和引用赋值变量销毁
Mar 23 PHP
详解PHP服务器如何在有限的资源里最大提升并发能力
详解PHP设计模式之依赖注入模式
阿里云服务器搭建Php+Apache运行环境的详细过程
php+laravel 扫码二维码签到功能
你真的了解PHP中的引用符号(&)吗
php中配置文件保存修改操作 如config.php文件的读取修改等操作
May 12 #PHP
php7中停止php-fpm服务的方法详解
May 09 #PHP
You might like
php对二维数组按指定键值key排序示例代码
2013/11/26 PHP
Codeigniter出现错误提示Error with CACHE directory的解决方案
2014/06/12 PHP
destoon利用Rewrite规则设置网站安全
2014/06/21 PHP
PHP清除数组中所有字符串两端空格的方法
2014/10/20 PHP
Yii多表联合查询操作详解
2016/06/02 PHP
php利用fsockopen GET/POST提交表单及上传文件
2017/05/22 PHP
从新浪弄下来的全屏广告代码 与使用说明
2007/03/15 Javascript
从sohu弄下来的flash中展示图片的代码
2007/04/27 Javascript
比较全的JS checkbox全选、取消全选、删除功能代码
2008/12/19 Javascript
JQuery 入门实例1
2009/06/25 Javascript
document.documentElement的一些使用技巧
2013/04/18 Javascript
jquery插件jTimer(jquery定时器)使用方法
2013/12/23 Javascript
node.js中的fs.lchmod方法使用说明
2014/12/16 Javascript
chrome不支持form.submit的解决方案
2015/04/28 Javascript
Backbone中View之间传值的学习心得
2016/08/09 Javascript
3种不同的ContextMenu右键菜单实现代码
2016/11/03 Javascript
jQuery无缝轮播图代码
2016/12/22 Javascript
jQuery实现表格元素动态创建功能
2017/01/09 Javascript
JavaScript严格模式下关于this的几种指向详解
2017/07/12 Javascript
JavaScript实现简单图片轮播效果
2017/08/21 Javascript
详解ES6之async+await 同步/异步方案
2017/09/19 Javascript
JavaScript生成简单等差数列
2017/11/28 Javascript
在vue-cli中组件通信的方法
2017/12/16 Javascript
vue主动刷新页面及列表数据删除后的刷新实例
2018/09/16 Javascript
详解easyui 切换主题皮肤
2019/04/04 Javascript
微信小程序实现拍照画布指定区域生成图片
2019/07/18 Javascript
[58:23]LGD vs TNC 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
[01:09:01]完美世界DOTA2联赛循环赛 Magma vs PXG BO2第一场 10.28
2020/10/28 DOTA
Python如何抓取天猫商品详细信息及交易记录
2018/02/23 Python
python 实现UTC时间加减的方法
2018/12/31 Python
Python3 hashlib密码散列算法原理详解
2020/03/30 Python
Python数据可视化实现漏斗图过程图解
2020/07/20 Python
美国CVS药店官网:CVS Pharmacy
2018/07/26 全球购物
妇女工作先进事迹
2014/08/17 职场文书
售后客服个人自我评价
2014/09/14 职场文书
Pytorch中Softmax与LogSigmoid的对比分析
2021/06/05 Python