смайлики отображаются в виде вопросительных знаков после вставки в базу данных php - PullRequest
0 голосов
/ 14 октября 2018

Я знаю, что об этом уже много раз спрашивали, и я перепробовал почти все из них, но все изменилось, поэтому, пожалуйста, продолжайте читать!Не отрицайте!Как я уже говорил, я испробовал большинство решений!

Я использовал utf8mb4 в качестве кодировки, а character_set_connection и character_set_database были установлены как utf8mb4.Кодировка на моих веб-страницах установлена ​​на utf8.Я использовал PDO, и когда я открываю соединение с базой данных, я использую utf8mb4 в качестве кодировки.Столбцы в таблицах также имеют в качестве параметров сортировки utf8mb4_unicode_ci. Используемый механизм хранения - MyISAM.

Разница возникает из-за того, что я не могу редактировать character_set_server (так как я на общем хостинге), он по умолчанию установлен как utf8 исервер collation_server по умолчанию - utf8_unicode_ui.Я не могу изменить это никакими средствами.Он работал нормально на локальном хосте с похожими символьными переменными.

Редактировать:
Переменная подключения $ conn, которая открывается как
$db_server = 'localhost'; $db_name = 'userdb'; $db_encoding = 'utf8mb4'; $db_user = 'test'; $db_pass = 'password'; $conn = new PDO('mysql:host='.$db_server.';dbname='.$db_name.';charset='.$db_encoding,$db_user,$db_pass);
Форма для принятияввод просто как
<form action="" method="POST" accept-charset="UTF-8"><input type="text" class="form-control" name="inp"></form>
И ввод обрабатывается как
$test = $_POST['inp']; $it = $conn->prepare("INSERT INTO tbl_test(message) VALUES(?)"); $it->bindParam(1,$test,PDO::PARAM_STR); if($it->execute()) echo $test; else echo 'Error!';

Так что вопрос:
1. Почему проблема возникает, даже когда яиспользовали везде где это возможно utf8mb4 и utf8mb4_unicode_ci?
2. Может ли это быть проблемой php, а не проблемой MySQL, поскольку проблема возникает во время INSERTION в базе данных (я использовал функции stripslashes (), trim () и htmlspecialchars () длястроки)?
3. Интересно, что смайлики (символы Юникода) прекрасно работают на одной странице сайта, которая является страницей чата.Может ли это быть из-за шифрования?Кажется, нет никакого возможного объяснения!

Просто имейте в виду, прежде чем ответить, что я перепробовал почти все решения на SO, и, поскольку я на виртуальном хостинге, я не могу редактировать файл конфигурации MySQL.Пожалуйста, ответьте, я застрял на этом более 3 дней!

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

Есть несколько вещей, которые должны быть объявлены utf8mb4 - столбец, соединение, форма и т. Д. От руки, похоже, что вы сделали все из них.

Посмотрите, что вызывает«вопросительный знак»: Проблема с символами UTF-8;я вижу не то, что я сохранил

Вы говорили о 2 character_set переменных, но не о 3, которые необходимы:

| character_set_client     | utf8mb4                    |
| character_set_connection | utf8mb4                    |
| character_set_results    | utf8mb4                    |

Проверьте, есть ли у вашего php.inidefault_charset UTF-8

Не используйте никакие формы кодирования / декодирования, это просто устраняет проблему.

Пожалуйста, покажите нам echo bin2hex($text); для некоторых смайликов.

0 голосов
/ 15 октября 2018

Потратив много времени на символьные переменные и конфигурации mysql, я исправил проблему с помощью простого решения: base64_encode.
Передача входной строки через base64_encode и последующее использование base64_decode для их отображения.работал в этом случае.Однако строки занимают больше места, чем раньше, но это решение действительно простое и достойное.
Я только что опубликовал этот вопрос, чтобы узнать, сталкивался ли кто-нибудь с чем-то похожим, но люди действительно не понимают основной вопрос.Вот где люди на SO становятся действительно утомительными.В любом случае спасибо за помощь людям!:)

...