使用 MPDF 生成 pdf,不间断空格显示为 unsuproprted 字符

问题描述

使用 Mpdf 8.0.8,我创建了一个带有自定义字体的文档,该字体显示正常,但不间断空格除外,这些空格显示为交叉方块:

enter image description here

当用 FontForge 打开我的字体时,我看到 uni00A0 字符被定义(它是空白的但没有交叉)

这是调用 Mpdf 的代码

public function getPdfData($values,$medias,$locale = 'fr_FR')
{
    $sessionLocale = $this->translator->getLocale();
    $this->translator->setLocale($locale);
    $html = $this->twig->render('@Pim/testPdf.html.twig');
    $this->translator->setLocale($sessionLocale);

    $defaultConfig = (new \Mpdf\Config\ConfigVariables())->getDefaults();
    $fontDirs = $defaultConfig['fontDir'];

    $defaultFontConfig = (new \Mpdf\Config\Fontvariables())->getDefaults();
    $fontData = $defaultFontConfig['fontdata'];

    $fontData = $fontData + [
            'myhelvet' => [
                'R' => 'helvetlight.ttf','I' => 'helvetthick.ttf',],'timeslightitalic' => [
                'R' => 'timeslightitalic.ttf'
            ]
        ];
    $defaultFont = 'myhelvet';

    $mpdf = new \Mpdf\Mpdf([
        'orientation' => 'L','margin_left' => 0,'margin_right' => 0,'margin_top' => 1,'margin_bottom' => 0,'fontDir' => array_merge($fontDirs,[
            __DIR__ . '/../Resources/public/fonts',]),'fontdata' => $fontData,'default_font' => $defaultFont,'mode' => '+aCJK',"autoScriptToLang" => true,"autoLangToFont" => true,]);
    $mpdf->addFontDirectory(__DIR__ . '/../Resources/public/fonts');
    $mpdf->WriteHTML($html);
    $pdfData = $mpdf->Output('','S');

    return $pdfData;
}

这里是无法呈现由 PHP NumberFormatter 创建的不间断空间的 html 视图:

<!DOCTYPE html>
<html>
<head>
    <title></title>
    <Meta http-equiv="content-type" content="text/html; charset=utf-8" />
    <Meta name="viewport" content="width=device-width,initial-scale=1.0">
</head>
<body>

<div style="font-family: myhelvet">Formatting a number: {{ '20000'|numberFormatLocale('fr_FR') }}</div>

</body>
</html>

最后,生成中断空间的 PHP 代码一个 Twig 过滤器):

public static function numberFormatLocale($number,$locale)
{
    $formatter = new \NumberFormatter($locale,\NumberFormatter::DECIMAL);

    return $formatter->format($number);
}

解决方法

NumberFormatter 的输出不是 U+00A0,而是 0xE2 0x80 0xAfU+202F - NARROW NO-BREAK SPACE字体。