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递归列出所有文件和目录的代码
Sep 10 PHP
php Try Catch异常测试
Mar 01 PHP
php 无限分类的树类代码
Dec 03 PHP
POSIX 风格和兼容 Perl 风格两种正则表达式主要函数的类比(preg_match, preg_replace, ereg, ereg_replace)
Oct 12 PHP
简单的移动设备检测PHP脚本代码
Feb 19 PHP
php实现单链表的实例代码
Mar 22 PHP
PHP Global定义全局变量使用说明
Aug 15 PHP
php自定义加密与解密程序实例
Dec 31 PHP
php源码分析之DZX1.5加密解密函数authcode用法
Jun 17 PHP
PHP自定义多进制的方法
Nov 03 PHP
PHP实现的数独求解问题示例
Apr 18 PHP
php使用redis的有序集合zset实现延迟队列应用示例
Feb 20 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的错误信息
2006/10/09 PHP
php文件怎么打开 如何执行php文件
2011/12/21 PHP
php去除头尾空格的2种方法
2015/03/16 PHP
Yii框架中sphinx索引配置方法解析
2016/10/18 PHP
PHP实现ASCII码与字符串相互转换的方法
2017/04/29 PHP
Javascript isArray 数组类型检测函数
2009/10/08 Javascript
jQuery 页面 Mask实现代码
2010/01/09 Javascript
node.js中的fs.unlink方法使用说明
2014/12/15 Javascript
jquery easyUI中ajax异步校验用户名
2016/08/19 Javascript
用JS中split方法实现彩色文字背景效果实例
2016/08/24 Javascript
jquery 标签 隔若干行加空白或者加虚线的方法
2016/12/07 Javascript
浅谈事件冒泡、事件委托、jQuery元素节点操作、滚轮事件与函数节流
2017/07/22 jQuery
Vue.js自定义事件的表单输入组件方法
2018/03/08 Javascript
通过 JS 判断页面是否有滚动条的实现方法
2018/04/05 Javascript
详解Vue 多级组件透传新方法provide/inject
2018/05/09 Javascript
快速解决vue动态绑定多个class的官方实例语法无效的问题
2018/09/05 Javascript
bootstrap-table后端分页功能完整实例
2020/06/01 Javascript
Python表示矩阵的方法分析
2017/05/26 Python
详解pandas如何去掉、过滤数据集中的某些值或者某些行?
2019/05/15 Python
python实现京东订单推送到测试环境,提供便利操作示例
2019/08/09 Python
python并发爬虫实用工具tomorrow实用解析
2019/09/25 Python
python函数装饰器之带参数的函数和带参数的装饰器用法示例
2019/11/06 Python
Python 将json序列化后的字符串转换成字典(推荐)
2020/01/06 Python
python中的itertools的使用详解
2020/01/13 Python
pytorch实现线性拟合方式
2020/01/15 Python
python读取文件指定行内容实例讲解
2020/03/02 Python
python3.6.5基于kerberos认证的hive和hdfs连接调用方式
2020/06/06 Python
HTML5拍照和摄像机功能实战详解
2019/01/24 HTML / CSS
KENZO官网:高田贤三在法国创立的品牌
2019/05/16 全球购物
写字楼租赁意向书
2014/07/30 职场文书
2014学习优秀共产党员先进事迹思想汇报
2014/09/14 职场文书
认错检讨书
2014/10/02 职场文书
习近平在党的群众路线教育实践活动总结大会上的讲话
2014/10/21 职场文书
Filebeat 采集 Nginx 日志的方法
2021/03/31 Servers
python基于scrapy爬取京东笔记本电脑数据并进行简单处理和分析
2021/04/14 Python
苹果电脑mac os中货币符号快捷输入
2022/02/17 杂记