php环境下iconv函数的用例一则

iconv函数是一个比较常用的PHP函数,特别是对工作环境在非GB2312下的Phper来讲这个函数的作用更是非常了得。最近遇见一个使用iconv函数中小小的问题,从Oracle数据库取得的中文信息是用gb码来保存的,从数据库取出数据后,执行iconv函数实现utf-8代码的转换。这种转换在常用中文字,数字,英文中可以正常工作。但是遇到一些诸如“→僾←”的字符,通过iconv转换出来的字符串不能够完整的显示。我的iconv语句:

iconv("GB2312","utf-8",$str);

查Google后,将iconv函数修改如下:

iconv("GB18030","utf-8",$str);

问题解决!

加一篇Google来的经验

转自CoolCode http://www.coolcode.cn/?p=41

昨天在调试 WAP 网站时发现,在增加了 GB2312 到 UTF-8 转化以后,有些页面显示不正常了——有些页面只有一半的内容,另一半被截掉了。因为被截掉的部分包含了

的后半个标签< /p>,因此整个页面都显示不出来,而报告错误。经过猜测、尝试,最后终于把问题集中在了 iconv 函数上。在经过高人指 点以后,发现这个函数的第二个参数,除了可以指定要转化到的编码以外,还可以增加两个后缀://TRANSLIT 和 //IGNORE,其中 //TRANSLIT 会自动将不能直接转化的字符变成一个或多个近似的字符,//IGNORE 会忽略掉不能转化的字符,而默认效果是从第一个非法字符截断。

但是我尝试了//TRANSLIT 和 //IGNORE 这两个后缀,效果还是不对。于是我想问题可能不是出在这里。从 GB2312 到 UTF-8 转化应该不会有不能转化的字符,因为 UTF-8 的字符集完全包含了 GB2312 中的字符,所以我想大概是前面要转化的字符集指定错了,于是我尝试着把 GB2312 改成 GBK,问题解决!虽然那两个后缀在这里没派上用场,不过也算学了一招,以后肯定会用到的。

补记:

改成 GBK 后,发现仍然有一封邮件的内容解析不正确。在另一位高人指点下,先换成 GB18030,问题依旧,然后改用 mb_convert_encoding 进行转换,问题解决!

不知道是 mb_convert_encoding 问题,还是我的系统问题,我用 mb_convert_encoding 时不支持 GB18030 编码。另外,用 GBK 或者GB18030 作为输入编码,并在输出编码中加上 //IGNORE 后缀,用 iconv 函数也能解决那封含有错误编码的邮件内容解析不正确的问题。不过用 mb_convert_encoding 可以指定多种输入编码,它会根据内容自动识别,这个比 iconv 要好的多。

No comments: