解决iconv和mb_convert_encoding函数的汉字乱码问题

近期在做一个小应用,就是填上信息,然后输出wordpress模板标准的style.css文件,当然,这个文件包含了CSSreset 和本人常用的原子类,这样可以大大缩小制作的难度和时间。

于是就遇到了一个编码问题,因为wordpress的编码是UTF-8,所以我们模板的css文件编码最好也是UTF-8。因为在早期的浏览器中,如果编码和文档中声明的不同,会读取不出来。IE6就是这样,在其他浏览器中没有出现类似的情况,不过还是建议使用UTF-8编码,如果你的模板要面向全世界的用户,你必须用这个编码,因为国外的电脑上没有装GBK、GB2312这类中文编码,就会出现乱码,或者出现一些其他的意外情况。

那么,我使用php接受字符串,并且输出的时候,需要使用编码相关的函数。经过搜索,找到了标题上面的两款函数。iconv和mb_convert_encoding,这两个函数,可以把字符串进行编码,然后配合file_put_contents这个函数,可以输出你指定的编码。我这个工具的原理很简单,就是获取表单内容,读取已经保存的写好的文件,然后混合编码,输出。

$add_string = $add_string.$fpr; //$fpr变量是读取之前写好的UTF-8编码的style.css文件模板
$add_string = iconv(“utf-8”,”utf-8”,$add_string); //由于读取的style.css文件是utf-8编码,所以这里用了utf-8编码转换utf-8编码
file_put_contents($new_filename,$add_string);

但是问题就出现了,出现在中文上了。由于iconv是php默认安装的模块,所以先使用的iconv函数。编写完成之后,输入中文信息,输出中断,查看输出文件,在中文的地方,输出了一个DZ,之后就断掉了。经过搜索,说这是iconv的一个bug,遇到“-”这样的符号,就出问题,可以使用“GBK”编码或者是加上“//IGNORE”参数解决。实验了一下,还是没有效果,加上了//IGNORE参数,中文全被过滤,只输出英文。

疯狂的在网上查找相关资料,没有找到,我找了一段网上编写的,有这个函数的应用,把代码运行了一下,结果发现,还是没有。蛋碎,别人写的可以用的代码,在自己电脑上还是不能支持中文。我phpinfo了一下,这个模块正常啊,我还把代码上传到远程服务器上,执行还是不行。

没办法,我考虑使用同样的功能的mb_convert_encoding函数,来试一下。结果还是不行,仍然出现乱码。这个时候,我突然想,不要把utf-8转换成utf-8 了,把GBK转换成utf-8试试怎么样啊。试了一下,表单部分在utf-8文件中,显示正常,但是模板(style.css模板用的utf-8编码)中的中文,全都变乱码了。研究一晚上这个问题了,已经到了0点了,果断关机睡觉。

在床上,翻来覆去的思考这个问题。最后的这个尝试,给了我一个思路。然后我就想明白了,我们用浏览器输入内容,我们也没有规定编码是什么,那系统得到我们输入的内容,它的编码是什么呢?那就只有GB2312 了,因为我中文系统默认的编码就是这样。所以,我对字符串的处理,应该是由GBK、GB2312来转换成UTF-8编码才对。这就是为什么最后,表单内容正常,而源css模板不正常了。我用utf-8保存的css模板,却用GBK的方式去读,然后转换成utf-8编码,读出来的时候,已经是乱码了,再把乱码转换成utf-8,那不更乱了。

不仅感叹一句,有多少问题,是在床上解决的,别想歪了哦 ^-^

今天早上起来,立刻按照昨晚想的思路写了一下,果然可以成功输出汉字。最终代码:

    $add_string = iconv(“GBK”,”utf-8”,$add_string);//先把表单内容转成utf-8
$add_string = $add_string.$fpr; //再与utf-8编码的css模板文件结合
file_put_contents($new_filename,$add_string); //输出

就这样,变化一下顺序,这个问题就完美解决了。今天写这篇文章时,发现这是一个多么简单的逻辑问题,却研究尝试了一个晚上,自己也真够笨的。不过最终解决了就好。我们平时都看书,太重于理论,到实践的时候,却发现,出现好多书上没有的错误。但是有了这个经历,以后遇到编码问题,就再也不用怕了。

另附这两个函数的用法:

iconv(“UTF-8”,”GB2312//IGNORE”,$data); //意思是把$data字符串由utf-8编码转成gb2312编码,刚开始就被这个误导了

mb_convert_encoding($data, “UTF-8”, “GBK”); //这个意思是把$data字符串,由gbk转成utf-8编码,注意顺序与iconv相反

至于gbk和gb2312,都是中文编码,区别在于,你想多打字,就打gb232,想少打字就打gbk.

此外,上面这两个函数,需要配合file_put_contents这个函数输入才有效,这个函数的用法和其他输出函数都一样.不再赘述.