1

我想导入我在 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");

这个解决方案应该适用于英语、希伯来语、法语、德语等字符。

4

2 回答 2

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);
}?>
于 2013-06-17T13:04:34.927 回答
0

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

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

如果您希望文档通过 W3C 验证,您还需要在文档的<meta>标签中声明这一点<head>

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

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

于 2012-08-14T19:47:10.900 回答