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 相关文章推荐
实用函数7
Nov 08 PHP
PHP日期处理函数 整型日期格式
Jan 12 PHP
解析link_mysql的php版
Jun 30 PHP
在windows平台上构建自己的PHP实现方法(仅适用于php5.2)
Jul 05 PHP
PHP连接MySQL的2种方法小结以及防止乱码
Mar 11 PHP
CI框架学习笔记(一) - 环境安装、基本术语和框架流程
Oct 26 PHP
PHP+Ajax实现无刷新分页实例详解(附demo源码下载)
Apr 07 PHP
PHP 在数组中搜索给定的简单实例 array_search 函数
Jun 13 PHP
浅谈Laravel队列实现原理解决问题记录
Aug 19 PHP
PHP 布尔值的自增与自减的实现方法
May 03 PHP
tp5(thinkPHP5框架)captcha验证码配置及验证操作示例
May 28 PHP
PHP实现微信提现功能(微信商城)
Nov 21 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
星际争霸, 教主第一视角, ZvT经典龙蛇演义
2020/03/02 星际争霸
php 归并排序 数组交集
2011/05/10 PHP
php array的学习笔记
2012/05/16 PHP
PHP daddslashes 使用方法介绍
2012/10/26 PHP
PHP生成随机字符串(3种方法)
2015/09/25 PHP
PHP实现多关键字加亮功能
2016/10/21 PHP
浅析PHP开发规范
2018/02/05 PHP
PHP重置数组为连续数字索引的几种方式总结
2018/03/12 PHP
TP5(thinkPHP5框架)实现显示错误信息及行号功能的方法
2019/06/03 PHP
Prototype使用指南之range.js
2007/01/10 Javascript
鼠标经过tr时,改变tr当前背景颜色
2014/01/13 Javascript
Javascript判断文件是否存在(客户端/服务器端)
2014/09/16 Javascript
EasyUI中datagrid在ie下reload失败解决方案
2015/03/09 Javascript
animate 实现滑动切换效果【实例代码】
2016/05/05 Javascript
全面解析Bootstrap中tab(选项卡)的使用方法
2016/06/06 Javascript
JS原型链怎么理解
2016/06/27 Javascript
基于Vue2的移动端开发环境搭建详解
2016/11/03 Javascript
Koa2微信公众号开发之本地开发调试环境搭建
2018/05/16 Javascript
深度了解vue.js中hooks的相关知识
2019/06/14 Javascript
用Vue.js在浏览器中实现裁剪图像功能
2019/06/18 Javascript
[42:00]完美世界DOTA2联赛PWL S3 Phoenix vs INK ICE 第一场 12.13
2020/12/17 DOTA
python基于phantomjs实现导入图片
2016/05/13 Python
kali中python版本的切换方法
2019/07/11 Python
解决Python安装时报缺少DLL问题【两种解决方法】
2019/07/15 Python
Django工程的分层结构详解
2019/07/18 Python
Python3爬虫中pyspider的安装步骤
2020/07/29 Python
Python 解析xml文件的示例
2020/09/29 Python
日本动漫周边服饰销售网站:Atsuko
2019/12/16 全球购物
海蓝之谜英国官网:La Mer英国
2020/01/15 全球购物
char型变量中能不能存贮一个中文汉字
2015/07/08 面试题
开业庆典活动策划方案
2014/09/21 职场文书
门市房租房协议书
2014/12/04 职场文书
小学家长意见怎么写
2015/06/03 职场文书
高一军训感想
2015/08/07 职场文书
《猴王出世》教学反思
2016/02/23 职场文书
VUE之图片Base64编码使用ElementUI组件上传
2022/04/09 Vue.js