html-encode output && неправильная строковая ошибка

мои данные включают арабские символы, которые выглядят как мусор в mysql, но отображаются корректно при запуске в браузере. мои вопросы:

  • как сделать html-кодирование вывода?
  • если я добавлю это ко всем моим файлам: <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> Я получаю эту ошибку: Error: Incorrect string value: '\xE4\xEE\xC3\xD8\xEF\xE6...' for column 'cQuotes' at row 1

Я работаю на платформе php / mysql.

вставка формы в html:

 <!doctype html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Your Favorite Quotes</title> <link rel="stylesheet" type="text/css" href="style.css" /> <link rel="stylesheet" href="css/validationEngine.jquery.css" type="text/css" media="screen" charset="utf-8" /> <script type="text/javascript" src="scripts/jquery-1.4.2.js"></script> <script src="scripts/jquery.validationEngine-en.js" type="text/javascript"></script> <script src="scripts/jquery.validationEngine.js" type="text/javascript"></script> <script type="text/javascript"> $(document).ready(function() { $("#submitForm").validationEngine() }) </script> </head> <body> <div class="container"> <div class="center_div"> <h2>Submit Your Quote</h2> <fieldset> <form id="submitForm" action="qinsert.php" method="post"> <div class="field"> <label>Author: </label> <input id="author" name="author" type="text" class="validate[required,custom[onlyLetter],length[0,100]]"> </div><br /> <div class="field"> <label>Quote: </label> <textarea id="quote" name="quote" class="validate[required, length[0,1000]]"></textarea> <br /> </div> <input id="button1" type="submit" value="Submit" class="submit" /><br /> <input id="button2" type="reset" value="Reset" /> </form> </fieldset> </div> </div> </body> </html> 

//////////////////////

запрос в php:

 //<?php //header('Content-Type: text/html; charset=UTF-8'); //?> <!doctype html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <link rel="stylesheet" type="text/css" href="style2.css" /> <title>Your Quote Databank</title> </head> <body> <?php include 'config.php'; echo "Connected <br />"; //check for quotes and apostrophes $author = ''; $quote = ''; $author = $_POST['author']; $quote = $_POST['quote']; $author = mysql_real_escape_string(trim($author)); $quote = mysql_real_escape_string(trim($quote)); //************************** //validating data $query = "SELECT * FROM Quotes where cQuotes = '$quote' limit 1;"; $result = mysql_query($query, $conn); //now check that the number of rows is 0 if (mysql_num_rows($result) > 0 ) { header("Location: /error.html"); exit; } //inserting data //mysql_query("SET NAMES 'utf8'"); //mysql_query("SET CHARACTER SET utf8"); $sql="INSERT INTO Quotes (vauthor, cquotes) VALUES ('$author', '$quote')"; if (!mysql_query($sql,$conn)) { die('Error: ' . mysql_error()); } echo "<div class='container'><p><label class='lbl_record'> Record Added Successfully!</label>"; echo "<a href='qform.html'> Submit a New Quote!</a></p>"; //************************** //selecting data $result = mysql_query("SELECT * FROM Quotes ORDER BY idQuotes DESC"); echo "<div class='center_div'>"; echo "<table> <thead> <tr> <th>Author</th> <th>Quotes</th> </tr> </thead>"; while($row = mysql_fetch_array($result)) { echo "<tbody><tr>"; echo "<td width='150px'>" . $row['vAuthor'] . "</td>"; echo "<td>" . $row['cQuotes'] . "</td>"; echo "</tr>"; } echo "</tbody></table>"; echo "</div></div>"; //************************** include 'close_config.php'; ?> </body> </html> 

 Incorrect string value: '\xE4\xEE\xC3\xD8\xEF\xE6...' 

Это похоже на арабскую строку, закодированную в ISO-8859-6. Вы получите эту ошибку, если вы получили строку байта ISO-8859-6 и пытаетесь вставить ее в таблицу базы данных UTF-8.

Ваш скрипт не должен был получать ISO-8859-6 из браузера, если ваша страница формы правильно помечена как UTF-8, как это предполагает meta . Проверьте в браузере, что при отображении формы в меню View-> Encoding отображается «UTF-8». <meta> может быть переопределен веб-сервером, передающим реальный заголовок Content-Type: text/html;charset=...

Это также может произойти, если ваш PHP пытается использовать неправильную кодировку для общения с сервером. Я вижу, что вы прокомментировали SET NAMES … Я бы использовал mysql_set_charset ('utf8'); в предпочтении.

 echo "<td>" . $row['cQuotes'] . "</td>"; 

Вам нужно HTML-кодировать вывод здесь, но не из-за проблем с кодировкой. Любые символы < и & требуют кодирования в тексте, иначе они могут вставлять нежелательную разметку HTML, включая JavaScript, и в этом случае у вас проблемы с межсайтовым скриптингом.

 echo '<td>'.htmlspecialchars($row['cQuotes']).'</td>'; 

Кроме того … однако PHP является языком шаблонов. Используйте его, не сражайтесь с ним, пытаясь сделать строковое шаблонирование самостоятельно.

 <table> <?php while ($row= mysql_fetch_array($result)) { ?> <tr> <td width="150"><?php h($row['vAuthor']) ?></td> <td><?php h($row['cQuotes']) ?></td> </tr> <?php } ?> </table> 

( width="150px" не работает, px – только для CSS.) Вышеприведенная функция вспомогательной функции, подобная этой, позволяет вам набирать htmlspecialchars так:

 function h($s) { echo htmlspecialchars($s, ENT_QUOTES); } 

нет таких вещей «персонажей». есть только кодировка . Вы должны определить кодировку, которую используете. И затем установите эту кодировку для всех трех частей приложения:

  • HTML-страница
  • PHP-скрипт
  • база данных

Рекомендуется использовать UTF-8.
Чтобы использовать его, вы должны установить кодировку базы данных, создав таблицы с клиентским кодированием по default charset=utf8 , mysql, выполнив запрос SET NAMES utf8 в приложении на стороне клиента и установив header("Content-Type: text/html; charset=utf-8"); для страницы, содержащей html-форму и для страницы с результатами

Согласно вашему изданию:
Добавьте эту строку в файл config.php:

 mysql_query("SET NAMES utf8"); 

А также проверьте кодировку таблиц mysql. Вы можете сделать это с помощью команды show create table Quotes

Вам не нужно использовать объекты HTML. Вам нужно выбрать кодировку символов, подходящую для арабских символов (например, UTF-8), и использовать все промежуточные инструменты для ее использования: MySQL, mysql_query (), PHP, HTML …

Попробуй это:

 while($row = mysql_fetch_array($result)) { echo "<tbody><tr>"; echo "<td width='150px'>" . htmlentities($row['vAuthor']) . "</td>"; echo "<td>" . htmlentities($row['cQuotes']) . "</td>"; echo "</tr>"; } 

для получения дополнительной информации см. функцию htmlentities ref

в то время как вы используете проверку jquery, вы можете попробовать это для арабского языка

 "onlyLetterSp": { "regex": /^[a-zA-Z\u0600-\u06FF\ \']+$/, "alertText": "* أحرف فقط" },