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的autoLoad自动加载机制
Sep 27 PHP
php判断上传的Excel文件中是否有图片及PHPExcel库认识
Jan 11 PHP
thinkphp中连接oracle时封装方法无法用的解决办法
Jun 17 PHP
php中的curl使用入门教程和常见用法实例
Apr 10 PHP
PHP中可以自动分割查询字符的Parse_str函数使用示例
Jul 25 PHP
ThinkPHP中RBAC类的四种用法分析
Nov 24 PHP
微信自定义菜单的处理开发示例
Apr 16 PHP
Symfony2框架学习笔记之表单用法详解
Mar 18 PHP
php版微信公众平台实现预约提交后发送email的方法
Sep 26 PHP
PHP中大括号'{}'用法实例总结
Feb 08 PHP
thinkphp3.2实现在线留言提交验证码功能
Jul 19 PHP
thinkPHP5.1框架路由::get、post请求简单用法示例
May 06 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
php 文章采集正则代码
2009/12/28 PHP
php实现获取及设置用户访问页面语言类
2014/09/24 PHP
详解yii2实现分库分表的方案与思路
2017/02/03 PHP
深入浅析安装PhpStorm并激活的步骤详解
2020/09/17 PHP
prettify 代码高亮着色器google出品
2010/12/28 Javascript
基于jquery的web页面日期格式化插件
2011/11/15 Javascript
cument.execCommand()用法深入理解
2012/12/04 Javascript
jQuery中has()方法用法实例
2015/01/06 Javascript
javascript实现全角半角检测的方法
2015/07/23 Javascript
深入理解JS addLoadEvent函数
2016/05/20 Javascript
详解angular2实现ng2-router 路由和嵌套路由
2017/03/24 Javascript
angular2路由切换改变页面title的示例代码
2017/08/23 Javascript
vue注册组件的几种方式总结
2018/03/08 Javascript
jQuery实现鼠标滑过商品小图片上显示对应大图片功能【测试可用】
2018/04/27 jQuery
Vue中 v-if 和v-else-if页面加载出现闪现的问题及解决方法
2018/10/12 Javascript
深入理解es6块级作用域的使用
2019/03/28 Javascript
用Vue编写抽象组件的方法
2019/05/06 Javascript
vue 实现搜索的结果页面支持全选与取消全选功能
2019/05/10 Javascript
JavaScript常用工具函数大全
2020/05/06 Javascript
[01:10:16]DOTA2上海特级锦标赛B组资格赛#2 Fnatic VS Spirit第一局
2016/02/27 DOTA
[03:23:49]2016.12.17日完美“圣”典全回顾
2016/12/19 DOTA
Django在Win7下的安装及创建项目hello word简明教程
2014/07/14 Python
Python的Django框架中模板碎片缓存简介
2015/07/24 Python
解读python logging模块的使用方法
2018/04/17 Python
Python开发虚拟环境使用virtualenvwrapper的搭建步骤教程图解
2018/09/19 Python
python3利用Socket实现通信的方法示例
2019/05/06 Python
python实现每天自动签到领积分的示例代码
2020/08/18 Python
CSS3+font字体文件实现圆形半透明菜单具体步骤(图解)
2013/06/03 HTML / CSS
char型变量中能不能存贮一个中文汉字
2015/07/08 面试题
职业教育毕业生求职信
2013/11/09 职场文书
安全生产标语大全
2014/10/06 职场文书
个人诉讼委托书范本
2014/10/17 职场文书
入股协议书范本
2014/11/01 职场文书
2014年财务个人工作总结
2014/12/08 职场文书
奖学金主要事迹范文
2015/11/04 职场文书
2016年感恩母亲节活动总结
2016/04/01 职场文书