详解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文件下载类
Dec 06 PHP
服务器web工具 php环境下
Dec 29 PHP
php数组函数序列 之array_count_values() 统计数组中所有值出现的次数函数
Oct 29 PHP
php代码书写习惯优化小结
Jun 20 PHP
PHPer 需要了解的 5 个 Composer 小技巧
Aug 18 PHP
修改destoon会员公司的伪静态中的com目录的方法
Aug 21 PHP
Laravel 5框架学习之Blade 简介
Apr 08 PHP
PHP实现XML与数据格式进行转换类实例
Jul 29 PHP
讲解WordPress开发中一些常用的debug技巧
Dec 18 PHP
PHP实现搜索地理位置及计算两点地理位置间距离的实例
Jan 08 PHP
PHP+mysql实现从数据库获取下拉树功能示例
Jan 06 PHP
PHP+ajax实现上传、删除、修改单张图片及后台处理逻辑操作详解
Feb 12 PHP
详解PHP服务器如何在有限的资源里最大提升并发能力
详解PHP设计模式之依赖注入模式
阿里云服务器搭建Php+Apache运行环境的详细过程
php+laravel 扫码二维码签到功能
你真的了解PHP中的引用符号(&)吗
php中配置文件保存修改操作 如config.php文件的读取修改等操作
May 12 #PHP
php7中停止php-fpm服务的方法详解
May 09 #PHP
You might like
PHP文件去掉PHP注释空格的函数分析(PHP代码压缩)
2013/07/02 PHP
浅析get与post的一些特殊情况
2014/07/28 PHP
PHP常用正则表达式集锦
2014/08/17 PHP
ThinkPHP数据操作方法总结
2015/09/28 PHP
Laravel中日期时间处理包Carbon的简单使用
2017/09/21 PHP
PHP实现绘制二叉树图形显示功能详解【包括二叉搜索树、平衡树及红黑树】
2017/11/16 PHP
javascript-TreeView父子联动效果保持节点状态一致
2007/08/12 Javascript
Javascript 继承机制实例
2009/08/12 Javascript
javascript中字符串替换函数replace()方法与c# 、vb 替换有一点不同
2010/06/25 Javascript
jQuery Migrate 1.1.0 Released 注意事项
2014/06/14 Javascript
javascript制作网页图片上实现下雨效果
2015/02/26 Javascript
jQuery获得指定元素坐标的方法
2015/04/14 Javascript
js数组去重的5种算法实现
2015/11/04 Javascript
关于JavaScript 原型链的一点个人理解
2016/07/31 Javascript
JS/HTML5游戏常用算法之路径搜索算法 随机迷宫算法详解【普里姆算法】
2018/12/13 Javascript
JavaScript实现简单计算器功能
2019/12/19 Javascript
[42:32]Secret vs Optic 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Linux中安装Python的交互式解释器IPython的教程
2016/06/13 Python
Python中取整的几种方法小结
2017/01/06 Python
django输出html内容的实例
2018/05/27 Python
Python机器学习k-近邻算法(K Nearest Neighbor)实例详解
2018/06/25 Python
对Python协程之异步同步的区别详解
2019/02/19 Python
pytorch多GPU并行运算的实现
2019/09/27 Python
Python input函数使用实例解析
2019/11/22 Python
JBL澳大利亚官方商店:扬声器、耳机和音响系统
2018/05/24 全球购物
意大利独特而优质的家居用品:Fazzini
2018/12/05 全球购物
几个Shell Script面试题
2012/08/31 面试题
EntityManager都有哪些方法
2013/11/01 面试题
母亲节演讲稿范文
2014/01/02 职场文书
人事经理岗位职责范本
2014/08/04 职场文书
车贷收入证明范本
2014/09/14 职场文书
中秋客户感谢信
2015/01/22 职场文书
2016寒假假期总结
2015/10/10 职场文书
Python如何利用正则表达式爬取网页信息及图片
2021/04/17 Python
HTML+VUE分页实现炫酷物联网大屏功能
2021/05/27 Vue.js
PHP获取学生成绩的方法
2021/11/17 PHP