详解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中使用Oracle数据库(6)
Oct 09 PHP
PHP的FTP学习(三)
Oct 09 PHP
php中目录,文件操作详谈
Mar 19 PHP
程序员编程十条戒律
Jul 09 PHP
php中定时计划任务的实现原理
Jan 08 PHP
PHPMailer的主要功能特点和简单使用说明
Feb 17 PHP
PHP中魔术变量__METHOD__与__FUNCTION__的区别
Sep 29 PHP
php集成动态口令认证
Jul 21 PHP
PHP生成图片缩略图类示例
Jan 12 PHP
yii2利用自带UploadedFile实现上传图片的示例
Feb 16 PHP
CI框架教程之优化验证码机制详解【验证码辅助函数】
Apr 16 PHP
laravel-admin 后台表格筛选设置默认的查询日期方法
Oct 03 PHP
详解PHP服务器如何在有限的资源里最大提升并发能力
详解PHP设计模式之依赖注入模式
阿里云服务器搭建Php+Apache运行环境的详细过程
php+laravel 扫码二维码签到功能
你真的了解PHP中的引用符号(&)吗
php中配置文件保存修改操作 如config.php文件的读取修改等操作
May 12 #PHP
php7中停止php-fpm服务的方法详解
May 09 #PHP
You might like
用PHP实现文件上传二法
2006/10/09 PHP
PHP+DBM的同学录程序(3)
2006/10/09 PHP
PHP文件上传原理简单分析
2011/05/29 PHP
php控制linux服务器常用功能 关机 重启 开新站点等
2012/09/05 PHP
用C/C++扩展你的PHP 为你的php增加功能
2012/09/06 PHP
php中FTP函数ftp_connect、ftp_login与ftp_chmod用法
2014/11/18 PHP
分享PHP函数实现数字与文字分页代码
2015/07/28 PHP
浅析Yii2 gridview实现批量删除教程
2016/04/22 PHP
PHP实现链式操作的三种方法详解
2017/11/16 PHP
javascript在事件监听方面的兼容性小结
2010/04/07 Javascript
jQuery实战之仿淘宝商城左侧导航效果
2011/04/12 Javascript
js 走马灯简单实例
2013/11/21 Javascript
js浮点数保留两位小数点示例代码(四舍五入)
2013/12/26 Javascript
点击button获取text内容并改变样式的js实现
2014/09/09 Javascript
js实现刷新页面后回到记录时滚动条的位置【两种方案可选】
2016/12/12 Javascript
利用transition实现文字上下抖动的效果
2017/01/21 Javascript
vue 2.0项目中如何引入element-ui详解
2017/09/06 Javascript
react学习笔记之state以及setState的使用
2017/12/07 Javascript
jQuery+CSS实现的table表格行列转置功能示例
2018/01/08 jQuery
JavaScript canvas仿代码流瀑布
2020/02/10 Javascript
Node.js web 应用如何封装到Docker容器中
2020/09/01 Javascript
JS绘图Flot应用图形绘制异常解决方案
2020/10/16 Javascript
[03:03]2014DOTA2国际邀请赛 EG战队专访
2014/07/12 DOTA
Python黑魔法Descriptor描述符的实例解析
2016/06/02 Python
Python简单实现查找一个字符串中最长不重复子串的方法
2018/03/26 Python
Python创建普通菜单示例【基于win32ui模块】
2018/05/09 Python
python 计算数据偏差和峰度的方法
2019/06/29 Python
解决jupyter运行pyqt代码内核重启的问题
2020/04/16 Python
用Python开发app后端有优势吗
2020/06/29 Python
Wilson体育用品官网:美国著名运动器材品牌
2019/05/12 全球购物
怎样让char类型的东西转换成int类型
2013/12/09 面试题
方法名是否可以与构造器的名字相同
2012/06/04 面试题
工程技术员岗位职责
2014/03/02 职场文书
人事经理岗位职责范本
2014/08/04 职场文书
2014年技术员工作总结
2014/11/18 职场文书
中学推普周活动总结
2015/05/07 职场文书