Создание PDF-документа с символами Unicode, хранящимися в базе данных

Я хочу создать PDF-документ с символами Unicode. Я сохранил использование utf8_unicode_ci в db.

Вот мой стол:

 language(word_id,english,sinhala,tamil) 

Это мой код для генерации pdf. Но слова sinhala n tamil не приходят.

 <?php $word_id= '2'; require_once '../model/language.php'; $obj=new Word(); $result=($obj->getWord($word_id)); include_once 'common/dompdf/dompdf_config.inc.php'; $date=date("Y/m/d"); $html="Word Details<br/>"; $value= mysql_fetch_assoc($result); $html.='<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <div style="float:left;width:96%"> <table border="0" width="100%"> <tr> <th>English Word : </th> <td><input type="text" name="enhlish" value="'.$value['english'].'"/></td> </tr> <tr> <td colspan="2"><hr/></td> </tr> <tr> <th>Sinhala Word : </th> <td><input type="text" name="sinhala" value="'.$value['sinhala'].'"/></td> </tr> <tr> <th>Tamli Word : </th> <td><input type="text" name="tamli" value="'.$value['tamil'].'"/></td> </tr> </table>'; $dompdf = new DOMPDF(); $dompdf = new DOMPDF(); $html = iconv('UTF-8','Windows-1250',$html); $dompdf->load_html($html,'UTF-8'); $dompdf->render(); $dompdf->stream("dompdf_out.pdf", array("Attachment" => false)); exit(0); include("foot.inc"); ?> в <?php $word_id= '2'; require_once '../model/language.php'; $obj=new Word(); $result=($obj->getWord($word_id)); include_once 'common/dompdf/dompdf_config.inc.php'; $date=date("Y/m/d"); $html="Word Details<br/>"; $value= mysql_fetch_assoc($result); $html.='<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <div style="float:left;width:96%"> <table border="0" width="100%"> <tr> <th>English Word : </th> <td><input type="text" name="enhlish" value="'.$value['english'].'"/></td> </tr> <tr> <td colspan="2"><hr/></td> </tr> <tr> <th>Sinhala Word : </th> <td><input type="text" name="sinhala" value="'.$value['sinhala'].'"/></td> </tr> <tr> <th>Tamli Word : </th> <td><input type="text" name="tamli" value="'.$value['tamil'].'"/></td> </tr> </table>'; $dompdf = new DOMPDF(); $dompdf = new DOMPDF(); $html = iconv('UTF-8','Windows-1250',$html); $dompdf->load_html($html,'UTF-8'); $dompdf->render(); $dompdf->stream("dompdf_out.pdf", array("Attachment" => false)); exit(0); include("foot.inc"); ?> 

Это код в модели:

 require_once 'connection.php'; class Word{ function getWord($word_id){ $conn = new Connection(); $sql = "select * from language where word_id='$word_id'"; $result = $conn->query($sql); return $result; } } 

Может ли кто-нибудь сообщить мне, что случилось с этим, и как я могу это исправить?

Сначала несколько общих советов …

В дополнение к хранению данных в формате UTF8 вам необходимо убедиться, что ваше соединение с базой данных находится в UTF8. Как вы это делаете, это зависит от вашей библиотеки доступа к данным. Я не могу сказать, какую библиотеку доступа к данным вы используете, но я вижу некоторые классические функции mysql. Если это то, что вы используете, вы можете использовать следующее сразу после подключения к базе данных:

 mysql_query("SET NAMES 'utf8'"); 

Вы также должны убедиться, что PHP работает в UTF8. Здесь есть две вещи, которые вам понадобятся. Во-первых, dompdf требует расширения MBString для правильной обработки многобайтовых символов. Во-вторых, вы, вероятно, хотите сказать PHP, чтобы обрабатывать ваши данные символов как UTF8 со следующим кодом:

 mb_internal_encoding('UTF-8'); 

Наконец, чтобы отображать символы, выходящие за пределы набора символов ANSI Windows, в формате PDF вам нужен шрифт, который поддерживает эти символы. dompdf v0.6.x по умолчанию используют шрифты DejaVu, но они не поддерживают tamil, поэтому вам придется загружать шрифт в dompdf. Самый простой способ сделать это – использовать шрифт @ font-face. Вы должны прочитать инструкцию dompdf Unicode How-To (она немного устарела, но по-прежнему имеет полезную информацию). Затем проверьте этот ответ на вопрос «dompdf и установите другое семейство шрифтов» .


Теперь некоторые конкретные советы …

1) Используйте UTF8 полностью. Вы работаете с набором символов на основе UTF8, и вы должны оставить его в этом наборе символов. Старые версии dompdf (0.5.x и более ранние) понимали только Windows-ANSI. Более новые версии работают в UTF8, и даже если вы не используете никаких специальных символов, UTF8 является предпочтительным кодированием документов.

2) Не конвертируйте из UTF8 в меньшую кодировку. При меньшем кодировании я подразумеваю преобразование из инклюзивного кодирования, такого как UTF8, который поддерживает большой набор символов с ограниченной кодировкой, такой как iso-8859-x или Windows-12XX. Опять же, если целевая кодировка не поддерживает ваших персонажей, вы потеряете информацию. Вы преобразовали строку документа из UTF8 в Windows-1250. Поддерживает ли эта кодировка даже тех персонажей, которые вы используете?

3) В вашем документе всегда должно быть указано правильное кодирование. Вы указываете в метатеге вашего документа, что документ закодирован в UTF8, и поэтому dompdf будет считать, что это подходящая кодировка. Если вы конвертируете в другую кодировку, ваши символы могут отображаться неправильно.

4) Как указано выше, вам нужен шрифт, который поддерживает символы, используемые в вашем документе. Вы не указываете шрифт вообще, и поэтому будет использоваться шрифт ядра PDF. Эти шрифты поддерживают только текст, закодированный с помощью Windows ANSI. Прочитайте это сообщение на трекере о проблеме dompdf о отображении символов тамилов: https://github.com/dompdf/dompdf/issues/838#issuecomment-47415806

Учитывая вышеизложенное, ваш код должен выглядеть следующим образом:

 include_once 'common/dompdf/dompdf_config.inc.php'; $date=date("Y/m/d"); $value= mysql_fetch_assoc($result); $html = ' <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <style> @font-face { font-family: latha; font-style: normal; font-weight: 400; src: url(http://yourfontprovider.com/latha.ttf) format("true-type"); } </style> </head> <body> Word Details<br/> <div style="float:left;width:96%"> <table border="0" width="100%"> <tr> <th>English Word : </th> <td><input type="text" name="enhlish" value="'.$value['english'].'"/></td> </tr> <tr> <td colspan="2"><hr/></td> </tr> <tr> <th>Tamli Word : </th> <td><input type="text" name="tamli" value="'.$value['tamil'].'" style="font-family: latha, sans-serif;" /></td> </tr> </table> </body> </html> '; $dompdf = new DOMPDF(); $dompdf->load_html($html,'UTF-8'); $dompdf->render(); $dompdf->stream("dompdf_out.pdf", array("Attachment" => false));