dompdf karakter codering UTF-8

Im proberen om pdf te creëren met de juiste tekens, maar er zijn “?” tekens.
Ik heb een test php-bestand, waar Im proberen om fing de beste oplossing. Als Im openen in de browser de html-I lijkt op ok

UTF-8 --> UTF-8 : X Ponuka číslo  černý Češký 

Maar als ik kijk in de pdf-ik zie dit

UTF-8 --> UTF-8 : X Ponuka slo  ?erný ?ešký 

Hier is mijn code:

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>č s š Š</title>
</head>
<body>
<?php 

require_once("dompdf/dompdf_config.inc.php");
$tab = array("UTF-8", "ASCII", "Windows-1250", "ISO-8859-2", "ISO-8859-1", "ISO-8859-6", "CP1256"); 
$chain = '<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <style></style><title>č s š Š</title></head><body>';
foreach ($tab as $i) 
    { 
        foreach ($tab as $j) 
        { 
            $chain .= "<br> $i --> $j : ".iconv($i, $j, 'X Ponuka číslo € černý Češký <br>'); 
        } 
    } 
$chain .= '<p style="font-family: firefly, verdana, sans-serif;">??????X Ponuka číslo € černý Češký <br></p></body></html>';
echo $chain; 
echo 'X Ponuka číslo € černý Češký <br>'; 

$filename = 'pdf/_1.pdf';
$dompdf = new DOMPDF();
$dompdf->load_html($chain, 'UTF-8');
$dompdf->set_paper('a4', 'portrait'); //change these if you need to
$dompdf->render();
file_put_contents($filename, $dompdf->output());

?> 
</body>
</html>

Wat Im verkeerd doen? Ik heb geprobeerd veel opties die ik gevonden heb 🙁 Enig idee?

  • De meeste bibliotheken niet mogelijk om gegevens te laden in een andere codering dan u vertellen expliciet de bibliotheek te laden. Dit resulteert vaak in het vraagtekens dan. Dus ik heb eigenlijk afvragen waarom denk je dat het wel met DOMPDF dit anders moeten zijn? Ook gewoon proberen door alle opties kan goed spelen, maar als dat spelen geen resultaten oplevert snelle, moet je een andere strategie om te begrijpen wat er gaande is.
  • Ik heb verschillende opties, omdat het moeilijk was om uit te vinden hoe het werkt, de charset ISO-8859-2 is er geen enkele bruikbare info over het, ik heb veel gegoogled, en ik wilde UTF-8, waar elke char is ok!
  • Ja, UTF-8 is een goede keuze als u wilt ondersteuning van alle (op computer systemen) bekende personages. Echter in de code hierboven, hoeft u meerdere coderingen in dezelfde snaar. Dat kan nooit goed uit te werken. In plaats daarvan is het beter om uit te vinden welke codering je snaren oorspronkelijk hebben. En dan met de specifieke codering om te zetten naar UTF-8. Je moet alleen wel een enkele re-encoding hier. Dit antwoord kan worden interesing ook voor u: stackoverflow.com/a/5159071/367456
InformationsquelleAutor lostika | 2013-05-05

 

10 Replies
  1. 32

    Moet je lezen over de Unicode-How-to weer. Het grootste probleem is dat je niet opgeven, een lettertype dat wordt ondersteund in uw tekens. Het lijkt erop dat je hebt gelezen hoe je, want je gebruikt het lettertype voorbeeld van dat document. Maar het voorbeeld is niet bedoeld voor het toepassen van wereldwijd tot elk document, dompdf niet firefly (een Chinees lettertype) of Verdana standaard.

    Als u geen lettertype wordt opgegeven dan dompdf valt terug naar een van de core-fonts (Helvetica, Times Roman, Courier), die alleen ondersteuning voor Windows ANSI-codering. Dus altijd zeker van om de stijl van uw tekst een lettertype ondersteunt Unicode-codering en de tekens die u wilt weergeven.

    Met dompdf 0.6.0 kunt u gebruik maken van de meegeleverde Deja Vu lettertypen. Dus de volgende zou moeten werken (alleen de HTML-code):

    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <style>
      body { font-family: DejaVu Sans, sans-serif; }
    </style>
    <title>č s š Š</title>
    </head>
    <body>
      <p>??????X Ponuka číslo € černý Češký <br></p>
    </body>
    </html>
    • NIET werken – € – teken net verloren in de schepping.
    • Welke versie van dompdf? De DejaVu lettertypen zijn slechts opgenomen te beginnen met 0.6.x. Ook zijn er meerdere zaken kunnen invloed hebben op de output. E. g., uw document moet eigenlijk worden gecodeerd als UTF-8-evenals de vermelding dat de codering in de header.
    • versie 0.6.1 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>en lettertype werd ingesteld binnen de css-en body-tag: font-family: Helvetica,"Times New Roman", serif;
    • u moet gebruik maken van de DejaVu-lettertypen als u het teken direct. De ingebouwde lettertypen worden weergegeven in het teken als u het coderen als &#0128; (de Windows-ANSI-teken positie).
    • Inmiddels heb ik vast dit door het schrijven van “Euro”, ik was met ‘&#8364;’ voor
    • Bedankt voor het wijzen op het gebruik van de DejaVu-lettertypen – deze keer had ik een precieze sjabloon om te vervullen. Best practice voor een volgend project is het maken van een template/ontwerp op basis van DejaVu font.
    • Dit werkt prima in de laatste dompdf (v0.7.0-beta2) downloaden van github.com/dompdf/dompdf/tags .
    • Ik op zoek was naar 3 dagen voor een oplossing, voor ik je gevonden had en nu werkt het perfect. DANK U WEL !!!

  2. 26

    Ik heb UTF-8-tekens te werken met deze combinatie.
    Voordat u doorgeven html DOMpdf, zorg codering covert met dit:

    $html = mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8');

    Gebruik DejaVu font in je css

    *{ font-family: DejaVu Sans; font-size: 12px;}

    Zorg ervoor dat u hebt ingesteld utf-8-codering in de HTML – <head> tag

    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

    Nu alle speciale tekens zijn werken “ÿ č č ť ū ą á é í”

    • Voor mij is het opgeven van <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> gewerkt
  3. 9

    Alleen Toevoegen

      <style>
        *{ font-family: DejaVu Sans !important;}
      </style>

    voordat </head>
    Het werkt voor mij.

    • Ook STELLEN def(“DOMPDF_ENABLE_HTML5PARSER”, false); aan def(“DOMPDF_ENABLE_HTML5PARSER”, true); in dompdf_config.inc.php -bestand.
  4. 2

    utf8_decode() deed de truc voor mij met enkele duitse vertalingen, zoals ä en ü.

    echo utf8_decode('X Ponuka číslo € černý Češký <br>');
  5. 1

    Dompdf ondersteunt geen fallback-fonts, dus u kunt geen gebruik maken van uw favoriete lettertype als het niet op je personages, en je kan ook niet worden ingesteld door een ander lettertype worden de fallback-lettertype voor die tekens, zoals droid sans fallback.

    Wat je kunt doen is gebruik te maken van regex unicode-script bereiken: https://www.regular-expressions.info/unicode.html wikkel deze blokken tekst in omspant en geef ze de fallback-lettertype.

    Voorbeeld:

    $body = 'test 简化字 彝語/彝语 test číslo € černý Češký';
    
    $cjk_scripts = 'Bopomofo|Han|Hiragana|Katakana';
    $cjk_scripts = preg_replace('/[a-zA-Z_]+/', '\\p{$0}', $cjk_scripts);
    
    //wrap the CJK characters into a span with it's own font
    $body = preg_replace("/($cjk_scripts)+/isu", '<span class="cjk">$0</span>', $body);
    
    //a font that supports CJK characters
    $cjk_font_path = APP_PATH.'/fonts/DroidSansFallbackFull.ttf';
    
    $html = <<<HTML
    <!DOCTYPE html>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <style type="text/css">
    @font-face {
        font-family: 'DroidSansFallbackFull';
        font-style: normal;
        font-weight: 400;
        src: url('$cjk_font_path') format('truetype');
    }
    body {
        font-family: DejaVu Sans, sans-serif;;
    }
    .cjk {
        font-family: DroidSansFallbackFull, sans-serif;
    }
    </style>
    </head>
    <body>$body</body>
    </html>
    HTML;
    
    $dompdf = new \DOMPDF();
    $dompdf->set_paper('A4');
    $dompdf->load_html($html);
    $dompdf->render();
    
    $dompdf->stream('test.pdf', ['Attachment'=>0]);

    Verwante: https://github.com/dompdf/dompdf/issues/1508

  6. 0

    Als je het niet erg met slechts één tekenset wijzigen u kunt elke karakterset in dompdf_font_family_cache.dist.php

    net als

    <?php
    $distFontDir = $rootDir . DIRECTORY_SEPARATOR . 'lib' . DIRECTORY_SEPARATOR . 'fonts' . DIRECTORY_SEPARATOR;
    return array(
        'sans-serif' =>
        array(
            'bold' => $distFontDir . 'DejaVuSans-Bold',
            'bold_italic' => $distFontDir . 'DejaVuSans-BoldOblique',
            'italic' => $distFontDir . 'DejaVuSans-Oblique',
            'normal' => $distFontDir . 'DejaVuSans'
        ),
        'times' =>
        array(
            'bold' => $distFontDir . 'DejaVuSans-Bold',
            'bold_italic' => $distFontDir . 'DejaVuSans-BoldOblique',
            'italic' => $distFontDir . 'DejaVuSans-Oblique',
            'normal' => $distFontDir . 'DejaVuSans'
        ),
        'times-roman' =>
        array(
            'bold' => $distFontDir . 'DejaVuSans-Bold',
            'bold_italic' => $distFontDir . 'DejaVuSans-BoldOblique',
            'italic' => $distFontDir . 'DejaVuSans-Oblique',
            'normal' => $distFontDir . 'DejaVuSans'
        ),
        'courier' =>
        array(
            'bold' => $distFontDir . 'DejaVuSans-Bold',
            'bold_italic' => $distFontDir . 'DejaVuSans-BoldOblique',
            'italic' => $distFontDir . 'DejaVuSans-Oblique',
            'normal' => $distFontDir . 'DejaVuSans'
        ),
        'helvetica' =>
        array(
            'bold' => $distFontDir . 'DejaVuSans-Bold',
            'bold_italic' => $distFontDir . 'DejaVuSans-BoldOblique',
            'italic' => $distFontDir . 'DejaVuSans-Oblique',
            'normal' => $distFontDir . 'DejaVuSans'
        ),
        'zapfdingbats' =>
        array(
            'bold' => $distFontDir . 'DejaVuSans-Bold',
            'bold_italic' => $distFontDir . 'DejaVuSans-BoldOblique',
            'italic' => $distFontDir . 'DejaVuSans-Oblique',
            'normal' => $distFontDir . 'DejaVuSans'
        ),
        'symbol' =>
        array(
            'bold' => $distFontDir . 'DejaVuSans-Bold',
            'bold_italic' => $distFontDir . 'DejaVuSans-BoldOblique',
            'italic' => $distFontDir . 'DejaVuSans-Oblique',
            'normal' => $distFontDir . 'DejaVuSans'
        ),
        'serif' =>
        array(
            'bold' => $distFontDir . 'DejaVuSans-Bold',
            'bold_italic' => $distFontDir . 'DejaVuSans-BoldOblique',
            'italic' => $distFontDir . 'DejaVuSans-Oblique',
            'normal' => $distFontDir . 'DejaVuSans'
        ),
        'monospace' =>
        array(
            'bold' => $distFontDir . 'DejaVuSans-Bold',
            'bold_italic' => $distFontDir . 'DejaVuSans-BoldOblique',
            'italic' => $distFontDir . 'DejaVuSans-Oblique',
            'normal' => $distFontDir . 'DejaVuSans'
        ),
        'fixed' =>
        array(
            'bold' => $distFontDir . 'DejaVuSans-Bold',
            'bold_italic' => $distFontDir . 'DejaVuSans-BoldOblique',
            'italic' => $distFontDir . 'DejaVuSans-Oblique',
            'normal' => $distFontDir . 'DejaVuSans'
        ),
        'dejavu sans' =>
        array(
            'bold' => $distFontDir . 'DejaVuSans-Bold',
            'bold_italic' => $distFontDir . 'DejaVuSans-BoldOblique',
            'italic' => $distFontDir . 'DejaVuSans-Oblique',
            'normal' => $distFontDir . 'DejaVuSans'
        ),
        'dejavu sans mono' =>
        array(
            'bold' => $distFontDir . 'DejaVuSansMono-Bold',
            'bold_italic' => $distFontDir . 'DejaVuSansMono-BoldOblique',
            'italic' => $distFontDir . 'DejaVuSansMono-Oblique',
            'normal' => $distFontDir . 'DejaVuSansMono'
        ),
        'dejavu serif' =>
        array(
            'bold' => $distFontDir . 'DejaVuSerif-Bold',
            'bold_italic' => $distFontDir . 'DejaVuSerif-BoldItalic',
            'italic' => $distFontDir . 'DejaVuSerif-Italic',
            'normal' => $distFontDir . 'DejaVuSerif'
        )
    )
    ?>

    Ik weet dat het niet de beste manier, maar het bespaart veel tijd

  7. 0

    Chinese karakters problemen soms.
    Het belangrijkste is om goede lettertype hier is een lijst die u kunt downloaden.

    Koos ik voor het eerst de naam “Kai Vet Lettertype” hier is een download pagina

    Zet het op uw hosting-service in een openbare map. Ik zet het in

    http://192.168.10.10/fonts/pdf/wts11.ttf

    en hier is mijn html-voorbeeld

    $html = <<<EOT
    <!DOCTYPE html>
    <html>
    <head>
       <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
       <style>
        @font-face {
          font-family: chinese;
            src: url('http://192.168.10.10/fonts/pdf/wts11.ttf') format('truetype');
        }
        .chineseLanguage { font-family: chinese; }
          body {font-family: DejaVu Sans, sans-serif;}
       </style>
    </head>
    <body>
        Chinese
        <div class='chineseLanguage'>
            忠烈祠
            中文 - 这工作<br> 
        </div>
        hello world <br> 
        Russian - русский текст <br>
        Greek - α,β,γ,δ,ε <br>
        chars - [email protected]#$%^&* -=-    <br><br>
        <br>
        Hebrew (iw)<br><br>
        דג סקרן שט בים מאוכזב ולפתע מצא לו חברה איך הקליטה<br>
        <br>    
    </body>
    </html>
    EOT;

    PS. er is een kleine kans dat je nodig zou kunnen hebben deze set:

    ini_set("allow_url_fopen", true);
  8. 0

    Ik had het zelfde probleem en ik heb het opgelost is erg simpel.
    Gewoon importeren google fonts met de vereiste taal subset in je CSS-bestand dat is gebruikt bij het genereren van HTML. Specificeer de utf-8 in uw HTML-bestand en het werkt…

    @import url('https://fonts.googleapis.com/css?family=Roboto:400,700&subset=latin-ext');
    body {font-family: 'Roboto', sans-serif;}
  9. -1

    Ik had hetzelfde probleem en eindigde met tcpdf.Hoop dat dit nuttig zouden kunnen zijn.
    http://www.tcpdf.org/

    Probleem is het lettertype dat ik gebruik.Ik was in staat om de juiste uitvoer gebruik van dit lettertype ‘freeserif’.Ik denk dat het mogelijk zou zijn om dezelfde output gebruik van dit lettertype met dompdf.

    $pdf->SetFont('freeserif', '', 12);

    Hier is het voorbeeld dat ik heb gebruikt.
    tcpdf utf-8 voorbeeld

    <?php
    header('Content-type: text/html; charset=UTF-8') ;//chrome
    require_once('tcpdf_include.php');
    
    //create new PDF document
    $pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
    
    $pdf->setFontSubsetting(true);
    
    $pdf->SetFont('freeserif', '', 12);
    
    $pdf->AddPage();
    
    $utf8text = '
    <html><head>  
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /></head><body>
    <b>Ponuka číslo € černý Češký </b></br>
    සිංහල  </br>
    <u>தேமல </u> </br>
    </body></html>';
    
    $pdf->SetTextColor(0, 63, 127);
    
    $pdf->writeHTML($utf8text, true, 0, true, true);
    
    $pdf->Output('example_008.pdf', 'I');
    
    ?>

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *