如何使用 ndash 将 utf-8 转换为 utf-16?
how to convert utf-8 to utf-16 with ndash?
两者:
$result = iconv('UTF-8', 'UTF-16LE//IGNORE//TRANSLIT', $str);
和mb_convert_encoding()
无法将破折号 (–) 转换为长减号。
结果将保存在 csv 文件中,因此无法将其替换为 html 实体。
有什么想法吗?
代码:
$data = $eventHelper->getProgramForCsvExport($event);
$response = new StreamedResponse();
$response->setCharset('UTF-16LE');
$filename = 'program-' . $event->getShortName() . $event->getShortYear() . '.csv';
$utf16Data = [];
foreach ($data as $row) {
$utf16row = [];
foreach ($row as $entry) {
$utf16row[] = iconv('UTF-8', 'UTF-16LE//IGNORE//TRANSLIT', $entry);
}
$utf16Data[] = $utf16row;
}
$response->setCallback(function () use ($utf16Data) {
$output = fopen('php://output', 'w+');
foreach ($utf16Data as $row) {
fputcsv($output, $row, ';');
}
fclose($output);
});
$response->headers->set('Content-Type', 'text/csv; charset=utf-16');
$response->headers->set('Content-Disposition', 'attachment; filename="' . $filename . '"');
return $response;
编辑:这是伟大的 office 365 的导出,它不再支持 UTF-8,但默认使用 UTF-16LE(据我所知)。
德语变音符号 (äöüß) 工作正常(在转换之前没有),但 ndash(可能还有其他一些特殊字符)不工作。 Ndashes 要么是空白(在 mac 上),要么在 windows.
上变成方括号(左右)
我认为问题在于您的代码没有在文件开头输出 UTF-16LE BOM(字节顺序标记),因此读取它的程序不知道它使用的是什么编码并且是 (显然)猜得不好。
UTF-16LE BOM 是文件开头的字节序列 0xFF
0xFE
(按此顺序)。将其作为您写入输出的第一件事。 this Unicode FAQ.
中有关 BOM 的更多信息
为了检验我的理论,我为包含 仅 个字符 0–0
:
的 UTF-16LE 文件编写了字节序列
FF FE 30 00 13 20 30 00
FF FE
是物料清单,30 00
是数字零,13 20
是N-dash,最后的30 00
是最后一位零。 (零就在那里,所以我可以很容易地找到破折号,尽管在这么短的文件中它并不难。)
我可以在 Windows 上用 Office 365 打开它,很好。
然后我写了一个没有BOM的文件:
30 00 13 20 30 00
Office 365 确实误解了 N-破折号并将其显示为看起来像一对括号的字符。
两者:
$result = iconv('UTF-8', 'UTF-16LE//IGNORE//TRANSLIT', $str);
和mb_convert_encoding()
无法将破折号 (–) 转换为长减号。
结果将保存在 csv 文件中,因此无法将其替换为 html 实体。 有什么想法吗?
代码:
$data = $eventHelper->getProgramForCsvExport($event);
$response = new StreamedResponse();
$response->setCharset('UTF-16LE');
$filename = 'program-' . $event->getShortName() . $event->getShortYear() . '.csv';
$utf16Data = [];
foreach ($data as $row) {
$utf16row = [];
foreach ($row as $entry) {
$utf16row[] = iconv('UTF-8', 'UTF-16LE//IGNORE//TRANSLIT', $entry);
}
$utf16Data[] = $utf16row;
}
$response->setCallback(function () use ($utf16Data) {
$output = fopen('php://output', 'w+');
foreach ($utf16Data as $row) {
fputcsv($output, $row, ';');
}
fclose($output);
});
$response->headers->set('Content-Type', 'text/csv; charset=utf-16');
$response->headers->set('Content-Disposition', 'attachment; filename="' . $filename . '"');
return $response;
编辑:这是伟大的 office 365 的导出,它不再支持 UTF-8,但默认使用 UTF-16LE(据我所知)。 德语变音符号 (äöüß) 工作正常(在转换之前没有),但 ndash(可能还有其他一些特殊字符)不工作。 Ndashes 要么是空白(在 mac 上),要么在 windows.
上变成方括号(左右)我认为问题在于您的代码没有在文件开头输出 UTF-16LE BOM(字节顺序标记),因此读取它的程序不知道它使用的是什么编码并且是 (显然)猜得不好。
UTF-16LE BOM 是文件开头的字节序列 0xFF
0xFE
(按此顺序)。将其作为您写入输出的第一件事。 this Unicode FAQ.
为了检验我的理论,我为包含 仅 个字符 0–0
:
FF FE 30 00 13 20 30 00
FF FE
是物料清单,30 00
是数字零,13 20
是N-dash,最后的30 00
是最后一位零。 (零就在那里,所以我可以很容易地找到破折号,尽管在这么短的文件中它并不难。)
我可以在 Windows 上用 Office 365 打开它,很好。
然后我写了一个没有BOM的文件:
30 00 13 20 30 00
Office 365 确实误解了 N-破折号并将其显示为看起来像一对括号的字符。