php 提供了两个常用的转码函数
iconv ( string $in_charset , string $out_charset , string $str ) 和
mb_convert_encoding ( string $str , string $to_encoding [, $from_encoding ] )(需要enable mbstring 扩展)
具体使用可以参考手册,我这里要说的是在使用mb_convert_encoding时可以配合mb_detect_encoding函数“探测”输入字符编码,代码如下
- $detect_encoding = mb_detect_encoding($content,array('ASCII','UTF-8','GB2312','GBK','BIG5'));
- mb_convert_encoding($content,'UTF-8',$detect_encoding);
同时在使用mb_conver_encoding应注意一下情况:
PHP中使用mb_convert_encoding转码的小陷阱
在php程序中使用mb_convert_encoding()方法进行字符编码转换大家都很熟悉了,平时也在大量的使用。而且在一般情况下该方法也表现 的足够好,值得表扬。但在一个项目中我们需要使用它进行UTF8到GBK的转换,在转换一些特殊字符时发现了一个不大不小的问题。具体表现为mb把在 utf8可编码的字符而在gbk中不可编码的字符都转成了\0x00\0x80,这样就导致转换后的gbk字符是有问题的。
在我们的意识中,在进行字符编码转换的过程中,如果遇到目标编码不可表现的字符,转码程序应该做的是舍弃这种字符,这样虽然丢失了部分数据,但不会导致转码的字符序列不可用。不清楚mb为什么要使用上述方式而不是舍弃方式。
临时的解决方式是对转码后的字符串序列进行过滤,过滤掉所有\x00\80的字符;又或者在转义之前对utf8的字符串进行过滤,过滤掉ut8可表示而gbk不可表示的所有字符,从实现难度上来讲,第一种过滤方式比较容易做到。