PHP iconv()函数字符编码转换的问题讲解


Posted in PHP onMarch 22, 2019

在php中iconv函数库能够完成各种字符集间的转换,是php编程中不可缺少的基础函数库;但有时候iconv对于部分数据转码会无缘无故的少一些。比如在转换字符"—"到gb2312时会出错。

下面一起慢慢看一下这个函数的用法。

最简单的应用,把gb2312置换成utf-8:

$text=iconv("GB2312","UTF-8",$text);

在用$text=iconv("UTF-8","GB2312",$text)过程中,如果遇到一些特别字符时,如:"—",英文名中的"."等等字符,转换就断掉了。这些字符后的文字都没法继续转换了。

针对这的问题,可以用如下代码实现:

$text=iconv("UTF-8","GBK",$text);

你没有看错,就这么简单,不使用gb2312,而写成GBK,就可以了。

还有一种方法,第二个参数,加上//IGNORE,忽略错误,如下:

iconv("UTF-8","GB2312//IGNORE",$data);

没有具体比较这两种方法,感觉第一种(GBK代替gb2312)方法更好。

php手册中iconv() 说明:

iconv

(PHP 4 >= 4.0.5, PHP 5)
iconv ? Convert string to requested character encoding
Description
string iconv ( string in_charset, string out_charset, string str )
Performs a character set conversion on the string str from in_charset to out_charset. Returns the converted string or FALSE on failure.
If you append the string //TRANSLIT to out_charset transliteration is activated. This means that when a character can't be represented in the target charset, it can be approximated through one or several similarly looking characters. If you append the string //IGNORE, characters that cannot be represented in the target charset are silently discarded. Otherwise, str is cut from the first illegal character.

在使用这个函数进行字符串编码转换时,需要注意,如果将utf-8转换为gb2312时,可能会出现字符串被截断的情况发生。此时可以使用以下方法解决:

$str=iconv('utf-8',"gb2312//TRANSLIT",file_get_contents($filepath));

即在第二个参数出添加红色字部分,表示:如果在目标编码中找不到与源编码相匹配的字符,会选择相似的字符进行转换。此处也可以使用://IGNORE 这个参数,表示忽略不能转换的字符。

ignore的意思是忽略转换时的错误,如果没有ignore参数,所有该字符后面的字符串都无法被保存。

iconv不是php的默认函数,也是默认安装的模块。需要安装才能用的。

如果是windows2000+php,你可以修改php.ini文件,将extension=php_iconv.dll前的";"去掉,同时你要copy你的原php安装文件下的iconv.dll到你的winnt/system32下(如果你的dll指向的是这个目录)。在linux环境下,用静态安装的方式,在configure时加多一项 --with-iconv就可以了,phpinfo看得到iconv的项。(Linux7.3+Apache4.06+php4.3.2)。

mb_convert_encoding与iconv函数介绍

mb_convert_encoding这个函数是用来转换编码的。原来一直对程序编码这一概念不理解,不过现在好像有点开窍了。不过英文一般不会存在编码问题,只有中文数据才会有这个问题。比如你用Zend Studio或Editplus写程序时,用的是gbk编码,如果数据需要入数据库,而数据库的编码为utf8时,这时就要把数据进行编码转换,不然进到数据库就会变成乱码。

做一个GBK To UTF-8:

<?php 
header("content-Type: text/html; charset=Utf-8"); 
echo mb_convert_encoding("???S我的友仔", "UTF-8", "GBK"); 
?>

再来个GB2312 To Big5:

<?php 
header("content-Type: text/html; charset=big5"); 
echo mb_convert_encoding("你是我的朋友", "big5", "GB2312"); 
?>

不过要使用上面的函数需要安装但是需要先enable mbstring 扩展库。

string mb_convert_encoding ( string str, string to_encoding [, mixed from_encoding] )需要先enable mbstring 扩展库,在 php.ini里将; extension=php_mbstring.dll 前面的 ; 去掉mb_convert_encoding 可以指定多种输入编码,它会根据内容自动识别,但是执行效率比iconv差太多;

string iconv ( string in_charset, string out_charset, string str )注意:第二个参数,除了可以指定要转化到的编码以外,还可以增加两个后缀://TRANSLIT 和 //IGNORE,其中 //TRANSLIT 会自动将不能直接转化的字符变成一个或多个近似的字符,//IGNORE 会忽略掉不能转化的字符,而默认效果是从第一个非法字符截断。

一般情况下用 iconv,只有当遇到无法确定原编码是何种编码,或者iconv转化后无法正常显示时才用mb_convert_encoding 函数。

$content = iconv("GBK", "UTF-8″, $content);
$content = mb_convert_encoding($content, "UTF-8″, "

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。如果你想了解更多相关内容请查看下面相关链接

PHP 相关文章推荐
兼容PHP5的PHP目录管理函数库
Jul 10 PHP
PHP的fsockopen、pfsockopen函数被主机商禁用的解决办法
Jul 08 PHP
PHP利用MySQL保存session的实现思路及示例代码
Sep 09 PHP
PHP实现获取域名的方法小结
Nov 05 PHP
php数组键值用法实例分析
Feb 27 PHP
Yii中Model(模型)的创建及使用方法
Dec 28 PHP
Yii2框架引用bootstrap中日期插件yii2-date-picker的方法
Jan 09 PHP
谈谈PHP连接Access数据库的注意事项
Aug 12 PHP
解决Laravel blade模板转义html标签的问题
Sep 03 PHP
laravel 解决路由除了根目录其他都404的问题
Oct 18 PHP
php操作redis数据库常见方法实例总结
Feb 20 PHP
PHP对接阿里云虚拟号的实现(号码隐私保护)
Apr 06 PHP
PHP里的$_GET数组介绍
Mar 22 #PHP
PHP匿名函数(闭包函数)详解
Mar 22 #PHP
PHP利用递归函数实现无限级分类的方法
Mar 22 #PHP
用PHP的反射实现委托模式的讲解
Mar 22 #PHP
PHP读取目录树的实现方法分析
Mar 22 #PHP
针对PHP开发安全问题的相关总结
Mar 22 #PHP
浅谈PHP中的Trait使用方法
Mar 22 #PHP
You might like
dedecms模版制作使用方法
2007/04/03 PHP
PHP 上传文件的方法(类)
2009/07/30 PHP
PHP实现的线索二叉树及二叉树遍历方法详解
2016/04/25 PHP
php+redis实现商城秒杀功能
2020/11/19 PHP
php微信公众号开发之答题连闯三关
2018/10/20 PHP
基于Laravel 多个中间件的执行顺序详解
2019/10/21 PHP
PHP使用gearman进行异步的邮件或短信发送操作详解
2020/02/27 PHP
JavaScript中valueOf函数与toString方法深入理解
2012/12/02 Javascript
jQuery插件StickUp实现网页导航置顶
2015/04/12 Javascript
详解AngularJS中的表达式使用
2015/06/16 Javascript
js+css实现的圆角边框TAB选项卡滑动门代码分享(2款)
2015/08/26 Javascript
jQuery实现表格元素动态创建功能
2017/01/09 Javascript
AngularJS报错$apply already in progress的解决方法分析
2017/01/30 Javascript
微信小程序实现的3d轮播图效果示例【基于swiper组件】
2018/12/11 Javascript
JS实现鼠标按下拖拽效果
2020/07/23 Javascript
[55:32]2018DOTA2亚洲邀请赛 4.4 淘汰赛 EG vs LGD 第二场
2018/04/05 DOTA
python3使用requests模块爬取页面内容的实战演练
2017/09/25 Python
Flask数据库迁移简单介绍
2017/10/24 Python
python如何修改装饰器中参数
2018/03/20 Python
python实现求特征选择的信息增益
2018/12/18 Python
Django+JS 实现点击头像即可更改头像的方法示例
2018/12/26 Python
Python实现图片批量加入水印代码实例
2019/11/30 Python
android面试问题与答案
2016/12/27 面试题
模范教师事迹材料
2014/02/10 职场文书
关爱女孩行动实施方案
2014/03/13 职场文书
乡镇信息公开实施方案
2014/03/23 职场文书
安全施工标语
2014/06/07 职场文书
艺术学院毕业生求职信
2014/07/09 职场文书
企业员工集体活动方案
2014/08/17 职场文书
暂停营业通知
2015/04/25 职场文书
2015年乡镇工会工作总结
2015/05/19 职场文书
2015年终个人政治思想工作总结
2015/11/24 职场文书
简单介绍 http请求响应参数、无连接无状态、MIME、状态码、端口、telnet、curl
2021/03/31 HTML / CSS
微信小程序scroll-view不能左右滑动问题的解决方法
2021/07/09 Javascript
Python使用psutil库对系统数据进行采集监控的方法
2021/08/23 Python
clear 万能清除浮动(clearfix:after)
2023/05/21 HTML / CSS