[英]Convert html entities to unicode characters via php mysql csv export
在我的MySQL数据库中,这是我拥有的HTML实体的示例:
Ú
当我通过脚本导出它时,我得到的是:
ú
如您所见,在我的脚本中我已经有了“ html_entity_decode”,可以将其适当地转换为此(这就是我想要的):
Ú
显然,我做错了。 我已经用尽了其他各种脚本,解决方案,否则已经尝试了一天多的时间来解决此问题。 这是我的PHP代码:
$link = mysqli_connect("localhost", "user", "pass", "db");
$sql="SELECT * FROM wtf";
$result=mysqli_query($link,$sql);
if (!$result) die('Couldn\'t fetch records');
$fp = fopen('php://output', 'w');
if ($fp && $result) {
header("Content-type: application/vnd.ms-excel");
header("Content-Encoding: UTF-8");
header('Content-Disposition: attachment; filename="results.csv"');
header('Pragma: no-cache');
header('Expires: 0');
fputcsv($fp, array('Nome'));
while ($row = $result->fetch_array(MYSQLI_NUM)) {
fputcsv($fp, array_map('html_entity_decode',array_values($row)), ',', '"');
}
die;
}
mysqli_close($link);
exit;
有人可以帮忙还是至少指向正确的方向? 进行了一个需要在CSV结果中使用欧洲字符的项目后,这简直就是一场噩梦...
听起来您可能正在使用PHP的较新版本,当调用html_entity_decode()
时,它将默认为“ UTF-8”。 也许尝试这样的事情:
代替这个:
fputcsv($fp, array_map('html_entity_decode',array_values($row)), ',', '"');
尝试这个:
fputcsv($fp, call_user_func_array('html_entity_decode', array(array_values($row), ENT_COMPAT, 'ISO-8859-1')), ',', '"');
该问题是由于Excel错误地解释了输出的字符编码引起的。
类似ú
的输出表明一个多字节字符被解释为两个单独的单字节字符。 当您用相同的字符串echo
而不是将字符串写为CSV时,它将正确呈现,因此这意味着问题不在PHP存储的字符串中。
标头Content-Encoding: UTF-8
找不到通向Excel的方式,因此为了使Excel知道UTF-8编码,请在输出的开头输出字节顺序标记 :
$fp = fopen('php://output', 'w');
if ($fp && $result) {
header("Content-type: application/vnd.ms-excel");
header("Content-Encoding: UTF-8");
header('Content-Disposition: attachment; filename="results.csv"');
header('Pragma: no-cache');
header('Expires: 0');
fwrite($fp, "\xEF\xBB\xBF"); // <--- add this
其次,当您将TAB字符用作分隔符而不是逗号时,事情也往往会更好地工作,例如在欧洲,某些区域设置将分号定义为分隔符(逗号用作十进制分隔符),这将使所有列合为一。 所以写:
fputcsv($fp, array('Nome'), "\t", '"');
while ($row = $result->fetch_array(MYSQLI_NUM)) {
fputcsv($fp, array_map('html_entity_decode',array_values($row)), "\t", '"');
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.