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控制用户的浏览器--ob*函数的使用说明
Mar 16 PHP
php 特殊字符处理函数
Sep 05 PHP
PHP学习笔记之数组篇
Jun 28 PHP
php动态生成函数示例
Mar 21 PHP
PHP整数取余返回负数的相关解决方法
May 15 PHP
ThinkPHP多表联合查询的常用方法
Mar 24 PHP
php上传文件并存储到mysql数据库的方法
Mar 16 PHP
php在apache环境下实现gzip配置方法
Apr 02 PHP
PHP内存使用情况如何获取
Oct 10 PHP
CodeIgniter配置之autoload.php自动加载用法分析
Jan 20 PHP
PHP中localeconv()函数的用法
Mar 26 PHP
PHP中的输出echo、print、printf、sprintf、print_r和var_dump的示例代码
Dec 01 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
文件系统基本操作类
2006/11/23 PHP
php数组函数序列之in_array() - 查找数组中是否存在指定值
2011/11/07 PHP
如何使用php判断服务器是否是HTTPS连接
2013/07/05 PHP
php正则取img标记中任意属性(正则替换去掉或改变图片img标记中的任意属性)
2013/08/13 PHP
php cookie工作原理与实例详解
2016/07/18 PHP
javascript+dom树型菜单类,希望朋友们一起进步
2007/05/03 Javascript
基于jQuery实现左右div自适应高度完全相同的代码
2012/08/09 Javascript
js汉字转拼音实现代码
2013/02/06 Javascript
jQuery中animate()方法用法实例
2014/12/24 Javascript
JavaScript中逗号运算符介绍及使用示例
2015/03/13 Javascript
JavaScript数组随机排列实现随机洗牌功能
2015/03/19 Javascript
jQuery简单实现提交数据出现loading进度条的方法
2016/03/29 Javascript
jQuery+CSS3文字跑马灯特效的简单实现
2016/06/25 Javascript
EasyUI中在表单提交之前进行验证
2016/07/19 Javascript
JavaScript Ajax实现异步通信
2016/12/14 Javascript
jQuery Autocomplete简介_动力节点Java学院整理
2017/07/17 jQuery
jQuery UI 实例讲解 - 日期选择器(Datepicker)
2017/09/18 jQuery
Node.js中sequelize时区的配置方法
2017/12/10 Javascript
JQuery Ajax动态加载Table数据的实例讲解
2018/08/09 jQuery
浅谈angularJS2中的界面跳转方法
2018/08/31 Javascript
Vue循环组件加validate多表单验证的实例
2018/09/18 Javascript
ES6数组与对象的解构赋值详解
2019/06/14 Javascript
Python实现3行代码解简单的一元一次方程
2014/08/18 Python
Python的Django框架中的Context使用
2015/07/15 Python
Python进程间通信Queue实例解析
2018/01/25 Python
查看django版本的方法分享
2018/05/14 Python
Django rest framework工具包简单用法示例
2018/07/20 Python
对Python获取屏幕截图的4种方法详解
2019/08/27 Python
python日期与时间戳的各种转换示例
2020/02/12 Python
美国零售商店:Blue&Cream
2017/04/07 全球购物
美国电子产品购物网站:BuyDig.com
2020/06/17 全球购物
幼教毕业生自我鉴定
2014/01/12 职场文书
2014新年寄语
2014/01/20 职场文书
内衣营销方案
2014/03/15 职场文书
目标责任书范本
2014/04/16 职场文书
医护人员继续教育学习心得体会
2016/01/19 职场文书