详解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 相关文章推荐
输出控制类
Oct 09 PHP
PHP CURL模拟登录新浪微博抓取页面内容 基于EaglePHP框架开发
Jan 16 PHP
分享一下贝贝成长进度的php代码
Sep 14 PHP
php实现自动获取生成文章主题关键词功能的深入分析
Jun 03 PHP
PHP编码规范的深入探讨
Jun 06 PHP
PHP无限分类(树形类)
Sep 28 PHP
PHP6新特性分析
Mar 03 PHP
Zend Framework教程之Zend_Db_Table_Row用法实例分析
Mar 21 PHP
php 流程控制switch的简单实例
Jun 07 PHP
PHP将身份证正反面两张照片合成一张图片的代码
Apr 08 PHP
laravel 5.3中自定义加密服务的方案详解
May 09 PHP
laravel 实现设置时区的简单方法
Oct 10 PHP
详解PHP服务器如何在有限的资源里最大提升并发能力
详解PHP设计模式之依赖注入模式
阿里云服务器搭建Php+Apache运行环境的详细过程
php+laravel 扫码二维码签到功能
你真的了解PHP中的引用符号(&)吗
php中配置文件保存修改操作 如config.php文件的读取修改等操作
May 12 #PHP
php7中停止php-fpm服务的方法详解
May 09 #PHP
You might like
PHP与SQL注入攻击[三]
2007/04/17 PHP
《PHP编程最快明白》第二讲 数字、浮点、布尔型、字符串和数组
2010/11/01 PHP
php flush无效,IIS7下php实时输出的方法
2016/08/25 PHP
PHP自定义函数实现assign()数组分配到模板及extract()变量分配到模板功能示例
2018/05/23 PHP
jQuery lazyLoad图片延迟加载插件的优化改造方法分享
2013/08/13 Javascript
基于jquery实现的文字淡入淡出效果
2013/11/14 Javascript
jQuery+ajax实现鼠标单击修改内容的思路
2014/06/29 Javascript
在Javascript中处理数组之toSource()方法的使用
2015/06/09 Javascript
jQuery Easyui 验证两次密码输入是否相等
2016/05/13 Javascript
javascript类型系统——日期Date对象全面了解
2016/07/13 Javascript
jQuery+Ajax请求本地数据加载商品列表页并跳转详情页的实现方法
2017/07/12 jQuery
Popup弹出框添加数据实现方法
2017/10/27 Javascript
[00:20]TI9不朽观赛名额抽取
2019/08/05 DOTA
Python中的descriptor描述器简明使用指南
2016/06/02 Python
django中静态文件配置static的方法
2018/05/20 Python
tensorflow学习教程之文本分类详析
2018/08/07 Python
对pandas读取中文unicode的csv和添加行标题的方法详解
2018/12/12 Python
pyftplib中文乱码问题解决方案
2020/01/11 Python
python实现126邮箱发送邮件
2020/05/20 Python
python统计mysql数据量变化并调用接口告警的示例代码
2020/09/21 Python
python调用百度API实现人脸识别
2020/11/17 Python
python中openpyxl和xlsxwriter对Excel的操作方法
2021/03/01 Python
澳大利亚在线购买儿童玩具:Toy Universe
2017/12/28 全球购物
女士和男士时尚鞋在线购物:Shoespie
2019/02/28 全球购物
意大利一家专营包包和配饰的网上商店:Borse Last Minute
2019/08/26 全球购物
JPA面试常见问题
2016/11/14 面试题
电子专业推荐信范文
2013/11/18 职场文书
学术会议邀请函范文
2014/01/22 职场文书
行政部岗位职责范本
2014/03/13 职场文书
事业单位鉴定材料
2014/05/25 职场文书
校园文化艺术节宣传标语
2014/10/09 职场文书
教师学习三严三实心得体会
2014/10/13 职场文书
教师先进个人材料
2014/12/17 职场文书
医药公司开票员岗位职责
2015/04/15 职场文书
Go标准容器之Ring的使用说明
2021/05/05 Golang
vue3使用vue-router的完整步骤记录
2021/06/20 Vue.js