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调用三种数据库的方法(3)
Oct 09 PHP
smarty模板嵌套之include与fetch性能测试
Dec 05 PHP
解析PHP中的unset究竟会不会释放内存
Jul 18 PHP
php快递单号查询接口使用示例
May 05 PHP
PHP实现通过get方式识别用户发送邮件的方法
Jul 16 PHP
一个完整的php文件上传类实例讲解
Oct 27 PHP
php获取当前页面完整URL地址
Dec 30 PHP
php结合mysql与mysqli扩展处理事务的方法
Jun 29 PHP
Laravel中间件实现原理详解
Oct 09 PHP
PHP读取文件的常见几种方法
Nov 03 PHP
基于Laravel实现的用户动态模块开发
Sep 21 PHP
java解析json方法总结
May 16 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中使用curl_init函数的说明
2010/11/02 PHP
PHP和JAVA中的重载(overload)和覆盖(override) 介绍
2012/03/01 PHP
PHP获取用户的浏览器与操作系统信息的代码
2012/09/04 PHP
PHP合并两个数组的两种方式的异同
2012/09/14 PHP
探讨:使用XMLSerialize 序列化与反序列化
2013/06/08 PHP
PHP 获取 ping 时间的实现方法
2017/09/29 PHP
解决laravel 出现ajax请求419(unknown status)的问题
2019/09/03 PHP
用 Javascript 验证表单(form)中的单选(radio)值
2009/09/08 Javascript
学习并汇集javascript匿名函数
2010/11/25 Javascript
js控制input输入字符解析
2013/12/27 Javascript
js中opener与parent的区别详细解析
2014/01/14 Javascript
Vuejs第十一篇组件之slot内容分发实例详解
2016/09/09 Javascript
在js里怎么实现Xcode里的callFuncN方法(详解)
2016/11/05 Javascript
学习vue.js中class与style绑定
2016/12/03 Javascript
jquery实现(textarea)placeholder自动换行
2016/12/22 Javascript
input 标签实现输入框带提示文字效果(两种方法)
2017/10/09 Javascript
Vue-router 中hash模式和history模式的区别
2018/07/24 Javascript
详解@angular/cli 改变默认启动端口两种方式
2018/11/29 Javascript
Python的设计模式编程入门指南
2015/04/02 Python
编写Python脚本来获取mp3文件tag信息的教程
2015/05/04 Python
python对html代码进行escape编码的方法
2015/05/04 Python
python针对不定分隔符切割提取字符串的方法
2018/10/26 Python
Django使用list对单个或者多个字段求values值实例
2020/03/31 Python
基于pytorch中的Sequential用法说明
2020/06/24 Python
性能测试工程师的面试题
2015/02/20 面试题
特色蛋糕店创业计划书
2014/01/28 职场文书
会计电算化毕业生自荐信
2014/03/03 职场文书
授权委托书格式模板
2014/04/03 职场文书
2014年社区国庆节活动方案
2014/09/16 职场文书
大专生自我鉴定怎么写
2014/09/16 职场文书
2014年保险业务员工作总结
2014/12/23 职场文书
一年级数学下册复习计划
2015/01/17 职场文书
2015年服务员工作总结
2015/04/08 职场文书
网络营销实训总结
2015/08/03 职场文书
python如何在word中存储本地图片
2021/04/07 Python
vue postcss-px2rem 自适应布局
2022/05/15 Vue.js