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版(4)
Oct 09 PHP
PHP+DBM的同学录程序(2)
Oct 09 PHP
PHP+DBM的同学录程序(4)
Oct 09 PHP
PHP 使用pcntl和libevent 实现Timer功能
Oct 27 PHP
php获取网页请求状态程序示例
Jun 17 PHP
php生成二维码
Aug 10 PHP
PHP异常处理Exception类
Dec 11 PHP
PHP反射API示例分享
Oct 08 PHP
PHP简单实现冒泡排序的方法
Dec 26 PHP
PHPExcel在linux环境下导出报500错误的解决方法
Jan 26 PHP
Laravel使用消息队列需要注意的一些问题
Dec 13 PHP
gearman中worker常驻后台,导致MySQL server has gone away的解决方法
Feb 27 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
PHPMailer 中文使用说明小结
2010/01/22 PHP
解决PHP mysql_query执行超时(Fatal error: Maximum execution time …)
2013/07/03 PHP
mysql_escape_string()函数用法分析
2016/04/25 PHP
PHP使用Redis长连接的方法详解
2018/02/12 PHP
发布BlueShow v1.0 图片浏览器(类似lightbox)blueshow.js 打包下载
2007/07/21 Javascript
js加解密 脚本解密
2008/02/22 Javascript
JQuery 获取json数据$.getJSON方法的实例代码
2013/08/02 Javascript
nodejs导出excel的方法
2015/06/30 NodeJs
JS常见问题之为什么点击弹出的i总是最后一个
2016/01/05 Javascript
原生js的RSA和AES加密解密算法
2016/10/08 Javascript
BootStrap table使用方法分析
2016/11/08 Javascript
基于Angularjs+mybatis实现二级评论系统(仿简书)
2017/02/13 Javascript
微信小程序 两种为对象属性赋值的方式详解
2017/02/23 Javascript
vue + vuex todolist的实现示例代码
2018/03/09 Javascript
JavaScript动态加载重复绑定问题
2018/04/01 Javascript
Mac下通过brew安装指定版本的nodejs教程
2018/05/17 NodeJs
koa socket即时通讯的示例代码
2018/09/07 Javascript
vue+iview 实现可编辑表格的示例代码
2018/10/31 Javascript
浅谈vuex actions和mutation的异曲同工
2018/12/13 Javascript
Vue中常用rules校验规则(实例代码)
2019/11/14 Javascript
微信小程序实现星级评价
2019/11/20 Javascript
d3.js实现图形拖拽
2019/12/19 Javascript
JS运算符简单用法示例
2020/01/19 Javascript
JavaScript设计模式---单例模式详解【四种基本形式】
2020/05/16 Javascript
[01:02:04]EG vs Liquid 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.23
2019/09/05 DOTA
Python实现向QQ群成员自动发邮件的方法
2014/11/19 Python
Python3 itchat实现微信定时发送群消息的实例代码
2019/07/12 Python
python 类之间的参数传递方式
2019/12/20 Python
市场营销专业个人自荐信格式
2013/09/21 职场文书
《石榴》教学反思
2014/03/02 职场文书
森林防火宣传标语
2014/06/27 职场文书
天下第一关导游词
2015/02/06 职场文书
民事上诉状范文
2015/05/22 职场文书
通知怎么写?
2019/04/17 职场文书
vue组件vue-esign实现电子签名
2022/04/21 Vue.js
Centos7 Shell编程之正则表达式、文本处理工具详解
2022/08/05 Servers