详解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 相关文章推荐
第十一节 重载 [11]
Oct 09 PHP
php auth_http类库进行身份效验
Mar 19 PHP
php下载文件的代码示例
Jun 29 PHP
PHP常用的文件操作函数经典收藏
Apr 02 PHP
解析curl提交GET,POST,Cookie的简单方法
Jun 29 PHP
php中filter函数验证、过滤用户输入的数据
Jan 13 PHP
php自动识别文件编码并转换为UTF-8的方法
Jun 12 PHP
php实现字符串首字母转换成大写的方法
Mar 17 PHP
thinkPHP框架对接支付宝即时到账接口回调操作示例
Nov 14 PHP
php使用curl实现ftp文件下载功能
May 16 PHP
php实现生成PDF文件的方法示例【基于FPDF类库】
Jul 21 PHP
Yii框架学习笔记之应用组件操作示例
Nov 13 PHP
详解PHP服务器如何在有限的资源里最大提升并发能力
详解PHP设计模式之依赖注入模式
阿里云服务器搭建Php+Apache运行环境的详细过程
php+laravel 扫码二维码签到功能
你真的了解PHP中的引用符号(&)吗
php中配置文件保存修改操作 如config.php文件的读取修改等操作
May 12 #PHP
php7中停止php-fpm服务的方法详解
May 09 #PHP
You might like
PHP mb_convert_encoding文字编码的转换函数介绍
2011/11/10 PHP
ThinkPHP实现多数据库连接的解决方法
2014/07/01 PHP
PHP中SESSION的注销与清除
2015/04/16 PHP
WordPress中的shortcode短代码功能使用详解
2016/05/17 PHP
跨域请求之jQuery的ajax jsonp的使用解惑
2011/10/09 Javascript
jQuery图片轮播的具体实现
2013/09/11 Javascript
javascript和jquery修改a标签的href属性
2013/12/16 Javascript
js超时调用setTimeout和间歇调用setInterval实例分析
2015/01/28 Javascript
js仿QQ中对联系人向左滑动、滑出删除按钮的操作
2016/04/07 Javascript
easyui combogrid实现本地模糊搜索过滤多列
2017/05/13 Javascript
Angular4学习之Angular CLI的安装与使用教程
2018/01/04 Javascript
vue实现前进刷新后退不刷新效果
2018/01/26 Javascript
利用SpringMVC过滤器解决vue跨域请求的问题
2018/02/10 Javascript
clipboard在vue中的使用的方法示例
2018/10/19 Javascript
jQuery实现根据身份证号获取生日、年龄、性别等信息的方法
2019/01/09 jQuery
vue动画效果实现方法示例
2019/03/18 Javascript
Vue + Element UI图片上传控件使用详解
2019/08/20 Javascript
python小技巧之批量抓取美女图片
2014/06/06 Python
python常用web框架简单性能测试结果分享(包含django、flask、bottle、tornado)
2014/08/25 Python
详解Python中的元组与逻辑运算符
2015/10/13 Python
基于python时间处理方法(详解)
2017/08/14 Python
名片管理系统python版
2018/01/11 Python
python实现自动发送报警监控邮件
2018/06/21 Python
利用python打开摄像头及颜色检测方法
2018/08/03 Python
Django 自定义分页器的实现代码
2019/11/24 Python
Python3 xml.etree.ElementTree支持的XPath语法详解
2020/03/06 Python
Python如何读取、写入JSON数据
2020/07/28 Python
Python连接Mysql进行增删改查的示例代码
2020/08/03 Python
pycharm配置QtDesigner的超详细方法
2021/01/25 Python
Html5在手机端调用相机的方法实现
2020/05/13 HTML / CSS
银行实习生自我鉴定范文
2013/09/19 职场文书
会计试用期自我评价
2015/03/10 职场文书
干货:如何写好观后感 !
2019/05/21 职场文书
Redis安装启动及常见数据类型
2021/04/14 Redis
使用Python的开发框架Brownie部署以太坊智能合约
2021/05/28 Python
2021年最新用于图像处理的Python库总结
2021/06/15 Python