详解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
非常好的php目录导航文件代码
Oct 09 PHP
mysql_num_rows VS COUNT 效率问题分析
Apr 23 PHP
php购物车实现代码
Oct 10 PHP
说说PHP的autoLoad自动加载机制
Sep 27 PHP
解析Extjs与php数据交互(增删查改)
Jun 25 PHP
自己写了一个php检测文件编码的函数
Apr 21 PHP
php的mkdir()函数创建文件夹比较安全的权限设置方法
Jul 28 PHP
php使用COPY函数更新配置文件的方法
Jun 18 PHP
weiphp微信公众平台授权设置
Jan 04 PHP
PHP魔术方法之__call与__callStatic使用方法
Jul 23 PHP
php新建文件的方法实例
Sep 26 PHP
详解PHP服务器如何在有限的资源里最大提升并发能力
详解PHP设计模式之依赖注入模式
阿里云服务器搭建Php+Apache运行环境的详细过程
php+laravel 扫码二维码签到功能
你真的了解PHP中的引用符号(&)吗
php中配置文件保存修改操作 如config.php文件的读取修改等操作
May 12 #PHP
php7中停止php-fpm服务的方法详解
May 09 #PHP
You might like
咖啡知识 除了喝咖啡还有那些知识点
2021/03/06 新手入门
一些PHP写的小东西
2006/12/06 PHP
php_screw安装使用教程(另一个PHP代码加密实现)
2014/05/29 PHP
PHP处理会话函数大总结
2015/08/05 PHP
PHP implode()函数用法讲解
2019/03/08 PHP
laravel5.1框架model类查询的实现方法
2019/10/08 PHP
HTTP头隐藏PHP版本号实现过程解析
2020/12/09 PHP
jQuery学习笔记之jQuery的事件
2010/12/22 Javascript
Javascript 中的 call 和 apply使用介绍
2012/02/22 Javascript
jquery浏览器滚动加载技术实现方案
2014/06/03 Javascript
基于canvas实现的绚丽圆圈效果完整实例
2016/01/26 Javascript
jquery+css3实现会动的小圆圈效果
2016/01/27 Javascript
如何利用Promises编写更优雅的JavaScript代码
2016/05/17 Javascript
JavaScript 节流函数 Throttle 详解
2016/07/04 Javascript
基于JavaScript实现随机颜色输入框
2016/12/10 Javascript
原生js实现吸顶效果
2017/03/13 Javascript
js判断文件类型大小并给出提示的实现方法
2018/01/03 Javascript
详解webpack模块加载器兼打包工具
2018/09/11 Javascript
深入浅析Vue 中 ref 的使用
2019/04/29 Javascript
javascript实现的字符串转换成数组操作示例
2019/06/13 Javascript
JavaScript 扩展运算符用法实例小结【基于ES6】
2019/06/17 Javascript
跟老齐学Python之有容乃大的list(3)
2014/09/15 Python
python中numpy的矩阵、多维数组的用法
2018/02/05 Python
python输出带颜色字体实例方法
2019/09/01 Python
Python爬虫scrapy框架Cookie池(微博Cookie池)的使用
2021/01/13 Python
详解CSS3的perspective属性设置3D变换距离的方法
2016/05/23 HTML / CSS
Weekendesk意大利:探索多种引人入胜的周末主题
2016/10/14 全球购物
印尼美容产品购物网站:PerfectBeauty.id
2017/12/01 全球购物
静态变量和实例变量的区别
2015/07/07 面试题
商务英语毕业生自荐信范文
2013/11/08 职场文书
工程造价与管理专业应届生求职信
2013/11/23 职场文书
小学生节约用水倡议书
2014/05/15 职场文书
会计学习心得体会
2014/09/09 职场文书
校长师德表现自我评价
2015/03/05 职场文书
详解Spring Boot使用系统参数表提升系统的灵活性
2021/06/30 Java/Android
Github 使用python对copilot做些简单使用测试
2022/04/14 Python