繁体   English   中英

如何使用 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()无法转换 ndash (–) 长减号。

结果将进入 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 0xFE0xFE顺序)。 将其作为您写入输出的第一件事。 此 Unicode 常见问题解答中详细了解 BOM。

为了测试我的理论,我为包含字符0–0的 UTF-16LE 文件编写了字节序列:

FF FE 30 00 13 20 30 00

FF FE是 BOM, 30 00是数字零, 13 20是 N 破折号,最后的30 00是最后一位数字零。 (零就在那里,所以我可以很容易地找到破折号,尽管在如此短的文件中这并不难。😀)

我能够在 Windows 上使用 Office 365 打开它就好了。

然后我写了一个没有BOM的文件:

30 00 13 20 30 00

Office 365 确实误解了 N-dash 并将其显示为一个看起来像一对括号的字符。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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