ISO-8859-1 Символ усекает вставку текста в столбец utf-8 mysql

Поэтому у меня есть странная проблема усечения! Невозможно найти конкретный ответ на это.

Таким образом, в основном возникает проблема с очевидным символом ISO ½, который обрезает остальную часть текста при вставке в столбец с указанным UTF-8.

Давайте скажем, что моя строка: «Вам нужно добавить ½ стакана воды». MySQL усекает это, чтобы «вам нужно добавить»,

Если я:

print iconv("ISO-8859-1", "UTF-8//IGNORE", $text); 

Затем он выводит:

 ½ 

O_o

Хорошо, что это не работает, потому что мне нужен 1/2 сам по себе. Если я перейду на phpMyAdmin и скопирую и вставляю предложение и отправляю его, он работает как прелесть, поскольку вся строка находится там, где есть символ и оставшийся текст! Что-то не так, и я озадачен тем, что это такое. Я знаю, что это, вероятно, повлияет на других персонажей, поэтому основная проблема должна быть решена.

Язык, который я использую, – php, сам файл кодируется как UTF-8, а данные, которые я ввожу, имеют тип контента, соответствующий ISO-8859-1. Столбец – utf8_general_ci, и все наборы символов mysql установлены в UTF-8 в php: «SET character_set_result = 'utf8» и т. Д. … »

Что-то в вашем коде не обрабатывает строку как UTF8. Это может быть ваш PHP / HTML, это может быть в вашей связи с БД, или это может быть сама БД – все должно быть установлено как UTF8 последовательно, а если что-то не так, строка будет усекаться точно так же, как вы см. при пересечении границы UTF8 / не-UTF8.

Я предполагаю, что ваша БД совместима с UTF8 – это проще всего проверить. Обратите внимание, что сортировка может быть задана на уровне сервера, уровне базы данных, уровне таблицы и уровне столбца в таблице. Настройка сопоставления UTF8 в столбце должна переопределять что-либо еще для хранения, но остальные будут продолжать работать при разговоре с БД, если они также не являются UTF8. Если вы не уверены, явно установите соединение с UTF8 после его открытия:

 $dbh->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAMES 'utf8'"); 

Теперь ваш DB и соединение UTF8, убедитесь, что ваша веб-страница тоже. Опять же, это может быть установлено более чем в одном месте (.htaccess, php.ini). Если вы не уверены / не имеете доступа, просто переопределите то, что PHP поднимает по умолчанию в верхней части страницы:

 <?php ini_set('default_charset', 'UTF-8'); ?> 

Обратите внимание, что вы хотите, чтобы это было правильно в начале, прежде чем какой-либо текст будет выводиться с вашей страницы. После того, как текст будет выводиться, возможно, слишком поздно попробовать и указать кодировку – вы уже можете быть заблокированы по умолчанию на вашем сервере. Я также повторяю это в своих заголовках (возможно, излишнем):

 <head> <meta charset="UTF-8"> <meta http-equiv="Content-type" content="text/html; charset=UTF-8"> </head> 

И я переопределяю его на формах, где я беру данные:

 <FORM NAME="utf8-test" METHOD="POST" ACTION="utf8-test.php" enctype="multipart/form-data" accept-charset="UTF-8">" 

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

Наконец, вы упомянули, что в phpMyAdmin вы вставили строку, и она выглядела так, как ожидалось, – вы уверены, что страницы phpMyAdmin – это UTF8? Я не думаю, что они есть. Когда я храню данные UTF8 из своего PHP-кода, он просматривает как сырые 8-битные символы в phpMyAdmin. Если я беру ту же строку и сохраняю ее непосредственно в phpMyAdmin, она выглядит «правильно». Поэтому я предполагаю, что phpMyAdmin использует набор символов по умолчанию для моего локального сервера, а не UTF8.

Например, следующая строка, сохраненная на моей веб-странице:

 I can¹t wait 

Читает это в моем phpMyAdmin:

 I can’t wait 

Поэтому будьте осторожны при тестировании таким образом, поскольку вы действительно не знаете, какую кодировку использует phpMyAdmin для отображения или соединения с БД.

Если у вас все еще есть проблемы, попробуйте мой код ниже. Сначала я создаю таблицу для хранения текста в UTF8:

 CREATE TABLE IF NOT EXISTS `utf8_test` ( `id` int(11) NOT NULL AUTO_INCREMENT, `my_text` varchar(8000) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 

И вот некоторые PHP, чтобы проверить его. Он в основном принимает ваш вход в форму, эхо-сигналы, которые вводятся обратно на вас, и сохраняет / извлекает текст из БД. Как я уже сказал, если вы просматриваете данные непосредственно в phpMyAdmin, вы можете обнаружить, что он выглядит не так, но на странице ниже он должен всегда отображаться так, как ожидалось, из-за того, что соединение с страницей и db заблокировано для UTF8.

 <?php // Override whatever is set in php.ini ini_set('default_charset', 'UTF-8'); // The following should not be required with the above override //header('Content-Type:text/html; charset=UTF-8'); // Open the database $dbh = new PDO('mysql:dbname=utf8db;host=127.0.0.1;charset=utf8', 'root', 'password'); // Set the connection to UTF8 $dbh->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAMES 'utf8'"); // Tell MySql to do the parameter replacement, not PDO $dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); // Throw exceptions (and break the code) if a query is bad $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $id = 0; if (isset($_POST["StoreText"])) { $stmt = $dbh->prepare('INSERT INTO utf8_test (my_text) VALUES (:my_text)'); $stmt->execute(array(':my_text' => $_POST['my_text'])); $id = $dbh->lastInsertId(); } ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional/EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta charset="UTF-8"> <meta http-equiv="Content-type" content="text/html; charset=UTF-8"> <title>UTF-8 Test</title> </head> <body> <?php // If something was posted, output it if (isset($_POST['my_text'])) { echo "POSTED<br>\n"; echo $_POST['my_text'] . "<br>\n"; } // If something was written to the database, read it back, and output it if ($id > 0) { $stmt = $dbh->prepare('SELECT my_text FROM utf8_test WHERE id = :id'); $stmt->execute(array(':id' => $id)); if ($result = $stmt->fetch()) { echo "STORED<br>\n"; echo $result['my_text'] . "<br>\n"; } } // Create a form to take some user input echo "<FORM NAME=\"utf8-test\" METHOD=\"POST\" ACTION=\"utf8-test.php\" enctype=\"multipart/form-data\" accept-charset=\"UTF-8\">"; echo "<br>"; echo "<textarea name=\"my_text\" rows=\"20\" cols=\"90\">"; // If something was posted, include it on the form if (isset($_POST['my_text'])) { echo $_POST['my_text']; } echo "</textarea>"; echo "<br>"; echo "<INPUT TYPE = \"Submit\" Name = \"StoreText\" VALUE=\"Store It\" />"; echo "</FORM>"; ?> <br> </body> </html> 

Проверьте в mb_convert_encoding, если вы не можете изменить способ обработки данных. В противном случае сделайте себе одолжение и получите кодировку на той же странице, прежде чем она выйдет из-под контроля. UTF-8 использует многобайтовые символы, которые не распознаются в кодировке ISO-8859-1 (латинская). Википедия . Эта страница и эта страница являются хорошими источниками, а также этой отладочной таблицей .

Наконец, я столкнулся с этим, когда используются различные комбинации htmlentities, htmlspecialchars и html_entity_decode ..

Вы вызывали set_charset() в вашем соединении базы данных MySQLi? Для правильного использования real_escape_string() .

 $db = new mysqli(...); $db->set_charset('utf8'); 

Установка переменных сеанса в вашем соединении недостаточно – они влияют на то, что происходит на стороне сервера. set_charset повлияет на то, что происходит на стороне клиента.

Вы можете проверить ссылку PHP mysqli :: real_escape_string