详解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生成二维码的两种方法(带logo图像)
Mar 14 PHP
php+mysql结合Ajax实现点赞功能完整实例
Jan 30 PHP
PHP使用mysql_fetch_row查询获得数据行列表的方法
Mar 18 PHP
PHP统计数值数组中出现频率最多的10个数字的方法
Apr 20 PHP
分享ThinkPHP3.2中关联查询解决思路
Sep 20 PHP
详解WordPress中创建和添加过滤器的相关PHP函数
Dec 29 PHP
Android App中DrawerLayout抽屉效果的菜单编写实例
Mar 21 PHP
PHPExcel笔记, mpdf导出
May 03 PHP
PHP 5.6.11 访问SQL Server2008R2的几种情况详解
Aug 08 PHP
LaravelS通过Swoole加速Laravel/Lumen详解
Mar 02 PHP
ThinkPHP5.0框架结合Swoole开发实现WebSocket在线聊天案例详解
Apr 02 PHP
laravel csrf排除路由,禁止,关闭指定路由的例子
Oct 21 PHP
详解PHP服务器如何在有限的资源里最大提升并发能力
详解PHP设计模式之依赖注入模式
阿里云服务器搭建Php+Apache运行环境的详细过程
php+laravel 扫码二维码签到功能
你真的了解PHP中的引用符号(&)吗
php中配置文件保存修改操作 如config.php文件的读取修改等操作
May 12 #PHP
php7中停止php-fpm服务的方法详解
May 09 #PHP
You might like
用php获取远程图片并把它保存到本地的代码
2008/04/07 PHP
php 智能404跳转代码,适合换域名没改变目录的网站
2010/06/04 PHP
PHP学习笔记 用户注册模块用户类以及验证码类
2011/09/20 PHP
完美利用Yii2微信后台开发的系列总结
2016/07/18 PHP
php is_writable判断文件是否可写实例代码
2016/10/13 PHP
PHP autoload使用方法及步骤详解
2020/09/05 PHP
网站上面有这种切换效果
2006/06/26 Javascript
javascript 读取图片文件的大小
2009/06/25 Javascript
鼠标左键单击冲突的问题解决方法(防止冒泡)
2014/05/14 Javascript
全面解析JavaScript里的循环方法之forEach,for-in,for-of
2020/04/20 Javascript
vue.js指令v-for使用及索引获取
2016/11/03 Javascript
微信小程序 仿猫眼实现实例代码
2017/03/14 Javascript
Vue.js 插件开发详解
2017/03/29 Javascript
详谈js使用in和hasOwnProperty获取对象属性的区别
2017/04/25 Javascript
对node.js中render和send的用法详解
2018/05/14 Javascript
微信小程序自定义多选事件的实现代码
2018/05/17 Javascript
实例分析vue循环列表动态数据的处理方法
2018/09/28 Javascript
vue实现下拉加载其实没那么复杂
2019/08/13 Javascript
JavaScript 闭包的使用场景
2020/09/17 Javascript
Python yield 小结和实例
2014/04/25 Python
使用Python脚本来获取Cisco设备信息的示例
2015/05/04 Python
详解python中的json和字典dict
2018/06/22 Python
解决pytorch报错:AssertionError: Invalid device id的问题
2020/01/10 Python
python时间序列数据转为timestamp格式的方法
2020/08/03 Python
python如何遍历指定路径下所有文件(按按照时间区间检索)
2020/09/14 Python
基于python爬取梨视频实现过程解析
2020/11/09 Python
next在python中返回迭代器的实例方法
2020/12/15 Python
CSS实现半透明边框与多重边框的场景分析
2019/11/13 HTML / CSS
html5 canvas实现跟随鼠标旋转的箭头
2016/03/11 HTML / CSS
厨房工作人员岗位职责
2013/11/15 职场文书
信息科学与技术专业求职信范文
2014/02/20 职场文书
人事科岗位职责范本
2014/03/02 职场文书
村班子对照检查材料
2014/08/18 职场文书
党性锻炼的心得体会
2014/09/03 职场文书
小学生运动会报道稿
2014/09/12 职场文书
老舍《猫》教学反思
2016/02/17 职场文书