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一些常用的正则表达式字符的一些转换
Jul 29 PHP
php header示例代码(推荐)
Sep 08 PHP
php中使用preg_match_all匹配文章中的图片
Feb 06 PHP
使用PHP获取当前url路径的函数以及服务器变量
Jun 29 PHP
codeigniter教程之多文件上传使用示例
Feb 11 PHP
php轻松实现中英文混排字符串截取
May 28 PHP
php中字符集转换iconv函数使用总结
Oct 11 PHP
PHP写日志的实现方法
Nov 05 PHP
php安装php_rar扩展实现rar文件读取和解压的方法
Nov 17 PHP
PHP获取当前执行php文件名的代码
Mar 02 PHP
解决thinkPHP 5 nginx 部署时,只跳转首页的问题
Oct 16 PHP
Laravel 实现Controller向blade前台模板赋值的四种方式小结
Oct 22 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实现采集程序原理和简单示例代码
2007/03/18 PHP
PHP下通过系统信号量加锁方式获取递增序列ID
2009/09/25 PHP
php中socket通信机制实例详解
2015/01/03 PHP
javascript开发随笔二 动态加载js和文件
2011/11/25 Javascript
javascript获取鼠标位置部分的实例代码(兼容IE,FF)
2013/08/05 Javascript
浅谈angular.js中实现双向绑定的方法$watch $digest $apply
2015/10/14 Javascript
实例讲解JavaScript的Backbone.js框架中的View视图
2016/05/05 Javascript
jquery dataview数据视图插件使用方法
2016/12/23 Javascript
利用jQuery实现一个简单的表格上下翻页效果
2017/03/14 Javascript
鼠标拖动改变DIV等网页元素的大小的实现方法
2017/07/06 Javascript
vue 使用ref 让父组件调用子组件的方法
2018/02/08 Javascript
vue父组件异步获取数据传给子组件的方法
2018/07/26 Javascript
微信小程序MUI侧滑导航菜单示例(Popup弹出式,左侧滑动,右侧不动)
2019/01/23 Javascript
vue 使用外部JS与调用原生API操作示例
2019/12/02 Javascript
[49:13]DOTA2上海特级锦标赛C组资格赛#1 OG VS LGD第一局
2016/02/27 DOTA
python网页请求urllib2模块简单封装代码
2014/02/07 Python
Python2.6版本中实现字典推导 PEP 274(Dict Comprehensions)
2015/04/28 Python
TF-IDF算法解析与Python实现方法详解
2017/11/16 Python
如何安装并使用conda指令管理python环境
2019/07/10 Python
Tensorflow中的图(tf.Graph)和会话(tf.Session)的实现
2020/04/22 Python
GitHub上值得推荐的8个python 项目
2020/10/30 Python
css3实现一款模仿iphone样式的注册表单
2013/03/20 HTML / CSS
HTML5 新表单类型示例代码
2018/03/20 HTML / CSS
浅谈HTML5中dialog元素尝鲜
2018/10/15 HTML / CSS
英国优质鞋类专家:Robinson’s Shoes
2017/12/08 全球购物
River Island美国官网:英国高街时尚品牌
2018/09/04 全球购物
美国价格实惠的在线眼镜网站:Zeelool
2020/12/25 全球购物
物流管理专业大学生自荐信
2013/10/04 职场文书
大二学习计划书范文
2014/04/27 职场文书
物业总经理助理岗位职责
2014/06/29 职场文书
破坏寝室公物检讨书
2014/11/17 职场文书
行政司机岗位职责
2015/04/10 职场文书
歌咏比赛口号大全
2015/12/25 职场文书
2016形势与政策学习心得体会
2016/01/12 职场文书
HTML5中 rem适配方案与 viewport 适配问题详解
2021/04/27 HTML / CSS
SQL Server表分区删除详情
2021/10/16 SQL Server