php iconv() : Detected an illegal character in input string


Posted in PHP onDecember 05, 2010

开始是这样用的
$str = iconv('UTF-8', 'GB2312', unescape(isset($_GET['str'])? $_GET['str']:''));
上线后报一堆这样的错:iconv() : Detected an illegal character in input string

考虑到GB2312字符集比较小,换个大的吧,于是改成GBK:
$str = iconv('UTF-8', 'GBK', unescape(isset($_GET['str'])? $_GET['str']:''));
上线后还是报同样的错!

再认真读手册,发现有这么一段:
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.
于是改成:
$str = iconv('UTF-8', 'GBK//IGNORE', unescape(isset($_GET['str'])? $_GET['str']:''));
本地测试//IGNORE能忽略掉它不认识的字接着往下转,并且不报错,而//TRANSLIT是截掉它不认识的字及其后面的内容,并且报错。//IGNORE是我需要的。
现在等待上线看结果(这样不是好的做法,继续琢磨手册,上网搜搜看),呵呵。。。

在网上找到下面这篇文章,发现mb_convert_encoding也可以,但效率比iconv差。

转换字符串编码iconv与mb_convert_encoding的区别

iconv — Convert string to requested character encoding(PHP 4 >= 4.0.5, PHP 5)
mb_convert_encoding — Convert character encoding(PHP 4 >= 4.0.6, PHP 5)

用法:
string mb_convert_encoding ( string str, string to_encoding [, mixed from_encoding] )
需要先启用 mbstring 扩展库,在 php.ini里将; extension=php_mbstring.dll 前面的 ; 去掉

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

使用:
1. 发现iconv在转换字符"-"到gb2312时会出错,如果没有ignore参数,所有该字符后面的字符串都无法被保存。不管怎么样,这个"-"都无法转换成功,无法输出。另外mb_convert_encoding没有这个bug.
2. mb_convert_encoding 可以指定多种输入编码,它会根据内容自动识别,但是执行效率比iconv差太多;如:$str = mb_convert_encoding($str,"euc-jp","ASCII,JIS,EUC-JP,SJIS,UTF- 8");“ASCII,JIS,EUC-JP,SJIS,UTF-8”的顺序不同效果也有差异
3. 一般情况下用 iconv,只有当遇到无法确定原编码是何种编码,或者iconv转化后无法正常显示时才用mb_convert_encoding 函数

from_encoding is specified by character code name before conversion. it can be array or string - comma separated enumerated list. If it is not specified, the internal encoding will be used.

$str = mb_convert_encoding($str, "UCS-2LE", "JIS, eucjp-win, sjis-win");
$str = mb_convert_encoding($str, "EUC-JP', "auto");

例子:
$content = iconv("GBK", "UTF-8", $content);
$content = mb_convert_encoding($content, "UTF-8", "GBK");

PHP 相关文章推荐
PHP与javascript的两种交互方式
Oct 09 PHP
PHP时间戳使用实例代码
Jun 07 PHP
腾讯QQ php程序员面试题目整理
Jun 08 PHP
使用array mutisort 实现按某字段对数据排序
Jun 18 PHP
浅析十款PHP开发框架的对比
Jul 05 PHP
php 判断是否是中文/英文/数字示例代码
Sep 30 PHP
PHP+memcache实现消息队列案例分享
May 21 PHP
PHP扩展CURL的用法详解
Jun 20 PHP
php过滤表单提交的html等危险代码
Nov 03 PHP
PHP接收json 并将接收数据插入数据库的实现代码
Dec 01 PHP
PHP使用strtotime获取上个月、下个月、本月的日期
Dec 30 PHP
CI框架中数据库操作函数$this->db->where()相关用法总结
May 17 PHP
php printf输出格式使用说明
Dec 05 #PHP
PHP执行zip与rar解压缩方法实现代码
Dec 05 #PHP
smarty模板嵌套之include与fetch性能测试
Dec 05 #PHP
php 学习资料零碎东西
Dec 04 #PHP
PHP访问MYSQL数据库封装类(附函数说明)
Dec 04 #PHP
PHP验证码类代码( 最新修改,完全定制化! )
Dec 02 #PHP
PHP项目开发中最常用的自定义函数整理
Dec 02 #PHP
You might like
?生?D片??C字串
2006/12/06 PHP
PHP 错误之引号中使用变量
2009/05/04 PHP
浅谈laravel 5.6 安装 windows上使用composer的安装过程
2019/10/18 PHP
JavaScript使用prototype定义对象类型
2007/02/07 Javascript
JavaScript获得选中文本内容的方法
2008/12/02 Javascript
原生JavaScript实现合并多个数组示例
2014/09/21 Javascript
nodejs调用cmd命令实现复制目录
2015/05/04 NodeJs
浅谈js中的引用和复制(传值和传址)
2016/09/18 Javascript
nodejs微信公众号支付开发
2016/09/19 NodeJs
layui弹出层效果实现代码
2017/05/19 Javascript
jQuery实现动态添加节点与遍历节点功能示例
2017/11/09 jQuery
基于Vue制作组织架构树组件
2017/12/06 Javascript
JS字符串去除连续或全部重复字符的实例
2018/03/08 Javascript
webpack打包react项目的实现方法
2018/06/21 Javascript
vue实现重置表单信息为空的方法
2018/09/29 Javascript
javascript中关于类型判断的一些疑惑小结
2018/10/14 Javascript
JavaScript实现捕获鼠标坐标
2020/04/12 Javascript
如何在vue 中使用柱状图 并自修改配置
2021/01/21 Vue.js
Python命令行参数解析模块optparse使用实例
2015/04/13 Python
Python中编写ORM框架的入门指引
2015/04/29 Python
Python类的动态修改的实例方法
2017/03/24 Python
Python tkinter模块中类继承的三种方式分析
2017/08/08 Python
Ubuntu16.04/树莓派Python3+opencv配置教程(分享)
2018/04/02 Python
python实现的生成word文档功能示例
2019/08/23 Python
PyTorch中的C++扩展实现
2020/04/02 Python
Python + opencv对拍照得到的图片进行背景去除的实现方法
2020/11/18 Python
python中altair可视化库实例用法
2021/01/26 Python
香港钟表珠宝首饰商城:OneMallTime网摩间
2016/10/14 全球购物
北京大学自荐信范文
2014/01/28 职场文书
爱心倡议书范文
2014/05/12 职场文书
联片教研活动总结
2014/07/01 职场文书
个人四风问题对照检查材料
2014/09/26 职场文书
听课评课活动心得体会
2016/01/15 职场文书
职场领导同事生日简短祝福语
2019/08/06 职场文书
python 学习GCN图卷积神经网络
2022/05/11 Python
Spring boot admin 服务监控利器详解
2022/08/05 Java/Android