详解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之第三天
Oct 09 PHP
让codeigniter与swfupload整合的最佳解决方案
Jun 12 PHP
PHP判断文章里是否有图片的简单方法
Jul 26 PHP
使用PHP实现阻止用户上传成人照片或者裸照
Dec 25 PHP
PHP中应该避免使用同名变量(拆分临时变量)
Apr 03 PHP
php技巧小结【推荐】
Jan 19 PHP
PHP获取当前URL路径的处理方法(适用于多条件筛选列表)
Feb 10 PHP
php smtp实现发送邮件功能
Jun 22 PHP
PDO操作MySQL的基础教程(推荐)
Aug 18 PHP
PHP实现简单的模板引擎功能示例
Sep 02 PHP
PHP Post获取不到非表单数据的问题解决办法
Feb 27 PHP
50个优秀经典PHP算法大集合 附源码
Aug 26 PHP
详解PHP服务器如何在有限的资源里最大提升并发能力
详解PHP设计模式之依赖注入模式
阿里云服务器搭建Php+Apache运行环境的详细过程
php+laravel 扫码二维码签到功能
你真的了解PHP中的引用符号(&)吗
php中配置文件保存修改操作 如config.php文件的读取修改等操作
May 12 #PHP
php7中停止php-fpm服务的方法详解
May 09 #PHP
You might like
【星际争霸1】人族1v7家ZBath
2020/03/04 星际争霸
PHP文章采集URL补全函数(FormatUrl)
2012/08/02 PHP
PHP实现简单实用的验证码类
2015/07/29 PHP
基于Jquery的将DropDownlist的选中值赋给label的实现代码
2011/05/06 Javascript
javascript跟随滚动效果插件代码(javascript Follow Plugin)
2013/08/03 Javascript
JS保存和删除cookie操作 判断cookie是否存在
2013/11/13 Javascript
新增加的内容是如何将div的scrollbar自动移动最下面
2014/01/02 Javascript
Bootstrap每天必学之折叠
2016/04/12 Javascript
jquery结合html实现中英文页面切换
2016/11/29 Javascript
jQuery实现分页功能(含ajax请求、后台数据、附完整demo)
2017/04/03 jQuery
canvas基础绘制-绚丽倒计时的实例
2017/09/17 Javascript
jQuery实现的表格前端排序功能示例
2017/09/18 jQuery
详解使用Next.js构建服务端渲染应用
2018/07/10 Javascript
vue-cli 使用axios的操作方法及整合axios的多种方法
2018/09/12 Javascript
Vue.js中对css的操作(修改)具体方式详解
2018/10/30 Javascript
将RGB值转换为灰度值的简单算法
2019/10/09 Javascript
js+canvas实现纸牌游戏
2020/03/16 Javascript
vue中的v-model原理,与组件自定义v-model详解
2020/08/04 Javascript
python基础while循环及if判断的实例讲解
2017/08/25 Python
Python关于excel和shp的使用在matplotlib
2019/01/03 Python
Django框架静态文件使用/中间件/禁用ip功能实例详解
2019/07/22 Python
python3图片文件批量重命名处理
2019/10/31 Python
Python爬虫小例子——爬取51job发布的工作职位
2020/07/10 Python
Python Selenium操作Cookie的实例方法
2021/02/28 Python
美国著名的婴儿学步鞋老品牌:Robeez
2016/08/20 全球购物
德国知名健康零食网上商店:Seeberger
2017/07/27 全球购物
易程科技软件测试笔试
2013/03/24 面试题
Ajax主要包含了哪些技术
2014/06/12 面试题
日语专业毕业生自荐信
2013/11/11 职场文书
给老婆的婚前保证书
2014/02/01 职场文书
2014年领导班子专项整治整改方案
2014/09/28 职场文书
2015年上半年物业工作总结
2015/03/30 职场文书
cf战队宣传语
2015/07/13 职场文书
运动会通讯稿50字
2015/07/20 职场文书
2015年度个人工作总结报告
2015/10/24 职场文书
阿里云k8s服务升级时502错误 springboot项目应用
2022/04/09 Servers