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 和 MySQL 基础教程(三)
Oct 09 PHP
五款常用mysql slow log分析工具的比较分析
May 22 PHP
php发送post请求函数分享
Mar 06 PHP
PHP 中 Orientation 属性判断上传图片是否需要旋转
Oct 16 PHP
php检查页面是否被百度收录
Oct 28 PHP
php将文件夹打包成zip文件的简单实现方法
Oct 04 PHP
php 文件下载 出现下载文件内容乱码损坏的解决方法(推荐)
Nov 16 PHP
php数据库的增删改查 php与javascript之间的交互
Aug 31 PHP
Laravel框架执行原生SQL语句及使用paginate分页的方法
Aug 17 PHP
Laravel使用scout集成elasticsearch做全文搜索的实现方法
Nov 30 PHP
PHP chunk_split()函数讲解
Feb 12 PHP
laravel5.1框架基础之Blade模板继承简单使用方法分析
Sep 05 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/10/09 PHP
PHP实现图片简单上传
2006/10/09 PHP
PHP中的MYSQL常用函数(php下操作数据库必备)
2010/09/12 PHP
PHP中strlen()和mb_strlen()的区别浅析
2014/06/19 PHP
解密ThinkPHP3.1.2版本之模板继承
2014/06/19 PHP
php中函数前加&符号的作用分解
2014/07/08 PHP
[原创]ThinkPHP让../Public在模板不解析(直接输出)的方法
2015/10/09 PHP
详解php反序列化
2020/06/10 PHP
Prototype Object对象 学习
2009/07/12 Javascript
jquery ajax 检测用户注册时用户名是否存在
2009/11/03 Javascript
浅析js设置控件的readonly与enabled属性问题
2013/12/25 Javascript
jquery使用append(content)方法注意事项分享
2014/01/06 Javascript
JS小游戏之极速快跑源码详解
2014/09/25 Javascript
js正则匹配出所有图片及图片地址src的方法
2015/06/08 Javascript
jQuery实现产品对比功能附源码下载
2016/08/09 Javascript
在DWR中实现直接获取一个JAVA类的返回值的两种方法
2016/12/25 Javascript
vue2 如何实现div contenteditable=“true”(类似于v-model)的效果
2017/02/08 Javascript
js基于FileSaver.js 浏览器导出Excel文件的示例
2017/08/15 Javascript
JavaScript中使用参数个数实现重载功能
2017/09/01 Javascript
JS扩展String.prototype.format字符串拼接的功能
2018/03/09 Javascript
vue2.0模拟锚点的实例
2018/03/14 Javascript
浅谈微信小程序之官方UI框架we-ui使用教程
2018/08/20 Javascript
node.js中express模块创建服务器和http模块客户端发请求
2019/03/06 Javascript
layui 选择列表,打勾,点击确定返回数据的例子
2019/09/02 Javascript
微信小程序实现上拉加载功能
2019/11/20 Javascript
python原类、类的创建过程与方法详解
2019/07/19 Python
详解Python3 pickle模块用法
2019/09/16 Python
美国波西米亚风格精品店:South Moon Under
2019/10/26 全球购物
荷兰家电销售网站:Welhof
2020/12/08 全球购物
德国W家官网,可直邮中国的母婴商城:Windeln.de
2021/03/03 全球购物
物理力学求职信
2014/02/18 职场文书
危爆物品安全大检查大整治工作方案
2014/05/03 职场文书
出国签证在职证明
2014/09/20 职场文书
大学生学期个人总结
2015/02/12 职场文书
解约证明模板
2015/06/19 职场文书
SQL Server代理:理解SQL代理错误日志处理方法
2021/06/30 SQL Server