2014-07-03 95 views
2

如何支持非标准的字符。我有一个简短的脚本读取一个CSV文件,该文件如下所示:在PHP SplFileObject阅读CSV

$csv = new SplFileObject($pathToFile, 'r'); 

while (!$csv->eof() && ($row = $csv->fgetcsv()) && $row[0] !== null) { 
    var_dump($row); 
} 

该工程确定,但它有一些问题非标准字符。 CSV中有一些德语单词,我的具体问题是它有变音困难。行它输出的类型的一个例子是:

array(5) { 
    [0]=> 
     string(6) "J¦rgen" 
    [1]=> 
     string(8) "Lastname" 
    [2]=> 
     string(14) "[email protected]" 
    [3]=> 
     string(7) "Example" 
    [4]=> 
     string(7) "Example" 
} 

在的Jürgen的ü得到与替换|字符。

我试图把下面的代码之前:

mb_internal_encoding('UTF-8'); 

但它没有任何效果。

在Vi中打开csv文件显示成功,所以文件在服务器上是正确的。

任何人都可以建议如何在解析CSV时成功处理德语字符?

+0

适用于我。假设你在终端执行它,你使用的是哪种终端编码?通过浏览器试用。 – hek2mgl

+0

我从命令行运行它,但我做了一些调整,从浏览器运行并发生相同的事情。 来自CSV的值会被放入MySQL数据库表中,该表也不会获取虚拟字符。 (同一系统中的其他PHP脚本,其中数据来自HTTP POST而不是CSV文件,可成功处理变音符号并将它们插入到MySQL中而不会出现问题)。 – Jack

+0

尝试使用'iconv'(在命令行上)将文件转换为'utf-8'。你需要知道什么是csv文件的输入编码。为此,您需要查看生成csv的程序。如果这是不可能的,我最好的猜测是windows-CP-1252 – hek2mgl

回答

0

所示的代码本身应该工作。我想这个问题是由CSV文件的字符编码引起的,这似乎不是utf-8。你需要找出你的输入文件的编码是什么。

一旦你发现了,你可以使用iconv命令将文件转换为utf-8。 (在注释中你告诉输入编码是iso-8859-1)。

例子:

iconv -f 'iso-8859-1' -t 'utf-8' input.csv > utf8.csv 

注意!请不要尝试像这样直接覆盖文件:

iconv -f 'iso-8859-1' -t 'utf-8' data.csv > data.csv 

这会覆盖(截断)data.csv并导致完全数据丢失。这是因为在执行命令本身之前,shell会创建并截断输出文件。