也谈php编码转换

iefan posted @ 2013年5月07日 15:48 in 程序设计与学习 , 976 阅读

最近在做一个在线考试系统,系统架构完成后,直到昨天才拿到数据库文件,打开一看,是excel文件,本想着用PDO将EXCEL打开读取文件,但对于PDO打开EXCEL不是很熟悉,觉得还是处理数据库较为简单,于是将EXCEL导入至ACCESS中,后用PHP读取ACCESS并进行分类处理后存于网站数据库MYSQL中,但是转换完成后,打开网页一查看,凡是调用到数据库中数据的均是乱码,一看就是编码不正确,将网页编码改为GBK后,数据库中数据显示正确,但是其它汉字变为乱码。

由于所有网页文件均是UTF8编码,而且这个系统的模板引擎是用SMARTY3.1.0,查看SMARTY文件夹后,发现其均为UTF8编码,时间很紧迫,全部手动改文件是下下之策,无奈之下,只有想办法将数据库中的编码方式进行转变。 在网上查看了一下PHP转换编码的方式,感觉有些复杂,也不愿意去试,便想着是不是可以在数据存入数据库之前就将将转换为UTF8。

MSOFFICE系列软件默认编码是GBK(这一点是在多次试过之后,超级郁闷的情况下才意识到),所以如何将EXCEL数据转换为UTF8就是问题关键,其中试过的方法之一是将EXCEL数据全部复制出来,放入文本编辑器中,并将其转换为UTF8编码,然后将文本文件内容全部复制再粘帖回EXCEL,无奈,这样子存储的EXCEL文件依然是GBK编码。

后想到可以将EXCEL转存为CSV文件,再用文本编辑器将CSV文件转换为UTF8编码,后再用PHP的FGETCSV函数进行读取,这样子便可以读到UTF8的原数据,再将其存入MYSQL,便可以达到目的。

代码如下:


<?php
$row = 1;
if (($handle = fopen("c:\\example.csv", "r")) !== FALSE)
{
    while (($d= fgetcsv($handle, 2000, ",")) !== FALSE) {
        $num = count($data);
        echo "$num fields in line $row: \n";
        $row++;
        $ins_val = array(null, $d[0], $d[1], $d[2],$d[3], $d[4],$d[5],$d[6]);
        $strxxx = "insert into tk2011 values (?,?,?,?,?,?,?,?)";
        $st = $mysql->prepare($strxxx);
        $st->execute($ins_val);
    }
    fclose($handle);
}

这样一来,就将CSV文件以UTF8的方式存入了MYSQL数据库,在读取数据的时候,开始将FGETCSV函数的第二个参数设置为1000,由于CSV中有个别行的数据较长,出现了截断的情况,后改为2000,问题得到修正。最后,再用PHP将新导入的数据库数据提取并分类处理后,即可存入网站数据库中,至此问题全部解决。

总结:在这次解决问题的过程中,有几个需要注意的事情,一是在WINDOWS下处理数据,必须首先想到编码的问题,否则就会得到事倍功半的效果;二是编码的转换可以借助文本编辑器完成,用CSV方式进行数据间的交换不失为一种较快的解决方式,需要注意的是在将EXCEL转换为CSV时,首先看是否要将原表中的英文标点”,”转换为中文”,”,由于此次处理的全部都是中文题库,所以在转换之前,已经进行了全部替换。

最后,虽然还是不可避免地采用了数组进行处理,但是这和处理EXCEL有着本质的不同,前者得到的是UTF8数据,后者还是GBK数据。 关于MSOFFICE的编码问题,不知道是否有办法更改,有时间还是要查查,如果能更改的话,就不会走这么多弯路了。

2011年11月08日 13:41


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter