2012-08-14 90 views
1

我想导入一个我在PHP中创建的CSV文件,并在希伯来文中包含文本。用PHP在希伯来文中读取csv文件

这是我创建的文件:

header("Content-Type: application/comma-separated-values; charset=UTF-16LE"); 
header("Content-Disposition: attachment; filename=\"$fileName\""); 

res = ""; 
foreach($data as $row) { 
    foreach($row as $coll) { 
      $res .= $coll . "\t"; 
    } 

    $res .= "\r\n"; 
} 

// Convert $res from UTF8 to UTF-16LE and add special chars at the beginning 
echo chr(255) . chr(254) . mb_convert_encoding($res, 'UTF-16LE', 'UTF-8'); 

该代码工作,我得到一个CSV与希伯来字符的文件正确显示。

当我试图读取同一个文件时,希伯来文字符显示不好(例如,“自动设置”为0)。这是我试过的代码:

$fp = fopen($file_full_path,'r') or die("can't open file"); 
print "<table>\n"; 
while($csv_line = fgetcsv($fp)) { 
    print '<tr>'; 
    for ($i = 0, $j = count($csv_line); $i < $j; $i++) 
    { 
     $val = $csv_line[$i]; 
     print '<td>'.$val.'</td>'; 
    } 
    print "</tr>\n"; 
} 

print '</table>\n'; 
fclose($fp) or die("can't close file"); 

这个解决方案应该为英语,希伯来语,法语,德语字符和更多的工作。

回答

1

您需要告诉浏览器预期的字符集。该行添加到该显示数据的PHP脚本的顶部:

header("Content-Type: text/html; charset=UTF-16LE"); 

如果你想在文档通过W3C验证,则还需要在文档的<head>宣布这在<meta>标签。

您可能还需要处理放置在第一行文件中的BOM,如果您知道它始终存在,我建议在循环之前调用fseek($fp, 2);

此外,您应该使用fputcsv()函数来首先生成CSV文件。

+0

当添加标题(“内容的全功能-Type:text/html; charset = UTF-16LE“);到脚本的顶部,输出如下所示:掏浯楡狝振挚汩慹... 我试过使用fputcsv()来生成CSV文件,但希伯来文字符在打开时不能很好地显示它与Excel – Shani1351 2012-08-14 20:32:46

+0

@ Shani1351好的,这很奇怪 - 你确定内容是小endian?试试'Content-Type:text/html; charset = UTF-16BE' – DaveRandom 2012-08-14 20:41:04

+0

使用Content-Type时:text/html; charset = UTF-16BE输出如下所示:“老化过程êהליךԠזדקנותԉ”... – Shani1351 2012-08-14 20:45:58

1

基本上你需要使用下面的字符串转换为UTF-8

iconv(mb_detect_encoding($data[$c], mb_detect_order(), true), "UTF-8", $data[$c]) 

这里是读书UTF-8 CSV文件

<?php 
$row = 1; 
if (($handle = fopen("mycsv.csv", "r")) !== FALSE) { 
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { 
    $num = count($data); 
    $row++; 
    for ($c=0; $c < $num; $c++) { 
     echo iconv(mb_detect_encoding($data[$c], mb_detect_order(), true), "UTF-8", $data[$c]) . "<br />\n"; 
    } 
} 
fclose($handle); 
}?>