2014-09-19 104 views
1

我在使用PHP读取来自CSV文件的Unicode字符时遇到问题。使用PHP读取UNICODE CSV

以下是UNICODE csv文件的截图。

enter image description here

我使用的PHP代码如下所示。

$delimiter = ","; 
$row = 1; 
$handle = fopen($filePath, "r"); 
while (($data = fgetcsv($handle, 1000, $delimiter)) !== FALSE) { 
    $num = count($data); 
    $row++; 
    for ($c=0; $c < $num; $c++) { 
    echo $data[$c]; 
    } 
} 
fclose($handle); 

对于上面的代码,我在chrome浏览器中得到下面的输出。它有垃圾人物。

enter image description here

但是,如果我在echo语句添加一个换行符作为它下面给出正确的输出。

echo $data[$c]."\n"; 

enter image description here

为什么它的行为这样的吗?我不想追加这样的换行符。

+0

它使我变得更糟。如果我将**“\ n”**更改为**'\ n'**,则上述代码本身不起作用。 ??它杀了我的头。 – Malaiselvan 2014-09-19 19:22:01

回答

2

UNICODE CSV文件中的文本前添加以下。

Windows调用“Unicode”(误导Unicode;不是编码)的编码实际上是UTF-16LE。这是每个代码单元的两字节编码,所以ASCII字符出现为ASCII字节后跟零字节。

PHP的fgetcsv函数不支持UTF-16 CSV,它只支持ASCII兼容的编码。它在每个字节0x0A(换行符)和0x2C(逗号)上分开,但在UTF-16LE中换行符和逗号都是两字节序列,分别是0x0A 0x00和0x2C 0x00。这意味着您将在每个字段的前面获得前导单个0x00字节,但前一个字段会出现错误分割,而当值包含不是UTF-16编码的换行符/逗号的一部分的0x0A或0x2C字​​节时。

当您将此输出到UTF-16LE编码输出时,额外的0x00字节会将每个字段与最后一个字符排列成双字节对齐,这意味着浏览器查看它会将交替字段看作不对齐并打印由一个字符的前导字节形成的无用字符与前一个字符的尾部字节。

因此,有两种可能的事情可以做:

  • ,如果你必须在做任何选择,避免UTF-16。因为它不兼容ASCII,所以打破了许多期望的工具。一般来说,最好的编码是UTF-8,它可以包含所有的字符,并仍然是一个ASCII超集...不幸的是,Excel拒绝直接以UTF-8保存CSV文件。

  • 使用某些可理解UTF-16的CSV解析器。无论如何,避免使用PHP的CSV函数是一个好主意,因为它们与标准CSV不符(尽管存在标准......至少与RFC 4180和Excel生成的内容不符)是奇怪的事情。

0

尝试显示

header('Content-Type: text/html; charset=utf-8'); 

$delimiter = ","; 
$row = 1; 
$handle = fopen($filePath, "r"); 
while (($data = fgetcsv($handle, 1000, $delimiter)) !== FALSE) { 
    $num = count($data); 
    $row++; 
    for ($c=0; $c < $num; $c++) { 
    echo $data[$c]; 
    } 
} 
fclose($handle); 
+0

不,还是一样的问题。 – Malaiselvan 2014-09-19 19:18:09