我想导入我在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");
此解决方案适用于英语,希伯来语,法语,德语字符等。
答案 0 :(得分:1)
您需要告诉浏览器期望的字符集。将此行添加到显示数据的PHP脚本的顶部:
header("Content-Type: text/html; charset=UTF-16LE");
如果您希望文档通过W3C验证,则还需要在文档<meta>
的{{1}}标记中声明此内容。
您可能还需要处理放在第一行文件中的BOM,我建议在循环之前调用<head>
,如果您知道它将始终存在。
此外,您应该首先使用fputcsv()
功能生成CSV文件。
答案 1 :(得分: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);
}?>