Detected an illegal character 万恶的编码错误

近日一直在倒腾一个OA系统的开发工作,坑爹的是服务器平台是WINDOWS,而且系统中有大量的中文名称的附件,系统的早期版本编码均为 GB2312,为了考虑未来其它平台能快速接入,因此需要将所有的内容统一成UTF-8的编码,同时现行的老系统还不能移除。(我是在吐槽WINDOWS服务器)

因此在附件的名称处理上系统中大量使用了php的iconv来对名称进行编码的转换,如:

  1. iconv('utf-8', 'gb2312', 'webcaft.com');

早期使用gb2312的字符集貌似跑的没问题,但是遇到一些特殊的地方就出现:

notice: iconv() [function.iconv]: detected an illegal character in input string …

后来查阅了一些资料发现说是GB2312的编码在转码的过程中包含的字符数有限,如以下特殊字符”《》“””等。因此要进行转码的话最好改成gbk,也就是如下:

  1. iconv('utf-8', 'gbk', 'webcaft.com');

当然还有一些极端的情况导致gbk也会报错,因此也有大神提出使用 //ignore 参数,如下:

  1. iconv('utf-8', 'gbk//ignore', 'webcaft.com');

ignore 会忽略掉不能转化的字符,而默认效果是从第一个非法字符截断。

但是这样做也有它的缺点,因为这样做其实是忽略了不能转换的字符,避免了出错但却不能够正确地输出(即空白不、输出)。实际应用又有人提出增强用法:

  1. $str = iconv('utf-8', 'gbk//ignore', unescape(isset($str)? $str:''));

本地测试//ignore能忽略掉它不认识的字接着往下转,并且不报错,而//translit是截掉它不认识的字及其后面的内容,并且报错。//ignore是我需要的。

其实除了iconv还有一个选择: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 里将;

  1. ;extension=php_mbstring.dll

前面的 ; 去掉

string iconv ( string in_charset, string out_charset, string str )

  1. $str = mb_convert_encoding($str, "ucs-2le", "jis, eucjp-win, sjis-win");
  2. $str = mb_convert_encoding($str, "euc-jp', "auto");
  3. ?>


发表评论?

1 条评论。

  1. 你的粉丝来啦!

发表评论


注意 - 你可以用以下 HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

无觅相关文章插件,快速提升流量