繁体   English   中英

通过php mysql csv export将HTML实体转换为Unicode字符

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM