详解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 获取当前访问的url文件名的方法小结
Feb 08 PHP
批量去除PHP文件中bom的PHP代码
Mar 13 PHP
如何利用php array_multisort函数 对数据库结果进行复杂排序
Jun 08 PHP
PHP魔术方法使用方法汇总
Feb 14 PHP
php四种定界符详解
Feb 16 PHP
详谈php ip2long 出现负数的原因及解决方法
Apr 05 PHP
深入理解Yii2.0乐观锁与悲观锁的原理与使用
Jul 26 PHP
PHP实现广度优先搜索算法(BFS,Broad First Search)详解
Sep 16 PHP
PHP实现链式操作的三种方法详解
Nov 16 PHP
Ajax+PHP实现的删除数据功能示例
Feb 12 PHP
php 利用socket发送GET,POST请求的实例代码
Jul 04 PHP
php实现简易计算器
Aug 28 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原理之Session Gc的一个小概率Notice
2011/04/12 PHP
php学习之function的用法
2012/07/14 PHP
PHP自动识别字符集并完成转码详解
2013/08/02 PHP
PHP实现利用MySQL保存session的方法
2014/08/23 PHP
WordPress中is_singular()函数简介
2015/02/05 PHP
php版阿里大于(阿里大鱼)短信发送实例详解
2016/11/30 PHP
PHP策略模式定义与用法示例
2017/07/27 PHP
用js得到网页中所有的div的id
2020/10/19 Javascript
捕获关闭窗口的脚本
2009/01/10 Javascript
js获取图片长和宽度的代码
2009/11/24 Javascript
扩展javascript的Date方法实现代码(prototype)
2010/11/20 Javascript
文本框输入时 实现自动提示(像百度、google一样)
2012/04/05 Javascript
使用jQuery实现的网页版的个人简历(可换肤)
2013/04/19 Javascript
JavaScript访问CSS属性的几种方式介绍
2014/07/21 Javascript
Node.js 学习笔记之简介、安装及配置
2015/03/03 Javascript
jQuery siblings()用法实例详解
2016/04/26 Javascript
javascript用正则表达式过滤空格的实现代码
2016/06/14 Javascript
详细探究ES6之Proxy代理
2016/07/22 Javascript
js实现一个猜数字游戏
2017/03/31 Javascript
Bootstrap Tree View简单而优雅的树结构组件实例解析
2017/06/15 Javascript
canvas基础绘制-绚丽倒计时的实例
2017/09/17 Javascript
浅谈对于react-thunk中间件的简单理解
2019/05/01 Javascript
详解iview的checkbox多选框全选时校验问题
2019/06/10 Javascript
微信小程序左滑删除实现代码实例
2019/09/16 Javascript
python网络爬虫 CrawlSpider使用详解
2019/09/27 Python
Python大数据之从网页上爬取数据的方法详解
2019/11/16 Python
python标识符命名规范原理解析
2020/01/10 Python
Keras—embedding嵌入层的用法详解
2020/06/10 Python
美国电视购物:QVC
2017/02/06 全球购物
护理自荐信
2013/10/22 职场文书
病人写给医生的感谢信
2015/01/23 职场文书
趣味运动会开幕词
2015/01/28 职场文书
董事长秘书岗位职责
2015/02/13 职场文书
保卫工作个人总结
2015/03/03 职场文书
毕业实习单位意见
2015/06/04 职场文书