Получение специальных символов из базы данных MySQL с помощью PHP

У меня есть таблица, которая включает специальные символы, такие как ™.

Этот символ можно вводить и просматривать с помощью phpMyAdmin и другого программного обеспечения, но когда я использую инструкцию SELECT в PHP для вывода в браузер, я получаю алмаз с вопросительным знаком в нем.

Тип таблицы – MyISAM. Кодировка – Unicode UTF-8. Сопоставление – utf8_unicode_ci.

Первая строка заголовка html

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

Я попытался использовать функцию htmlentities () в строке перед ее выходом. Не повезло.

Я также попытался добавить это к php перед любым выходом (без разницы):

 header('Content-type: text/html; charset=utf-8'); 

Наконец, я попытался добавить это прямо под исходное соединение mysql (это привело к отображению дополнительных нечетных символов):

 $db_charset = mysql_set_charset('utf8',$db); 

Что я пропустил?

Ниже код работает для меня.

 $sql = "SELECT * FROM chartest"; mysql_set_charset("UTF8"); $rs = mysql_query($sql); header('Content-type: text/html; charset=utf-8'); while ($row = mysql_fetch_array($rs)) { echo $row['name']; } - $sql = "SELECT * FROM chartest"; mysql_set_charset("UTF8"); $rs = mysql_query($sql); header('Content-type: text/html; charset=utf-8'); while ($row = mysql_fetch_array($rs)) { echo $row['name']; } 

Есть пара вещей, которые могут помочь. Во-первых, даже если вы устанавливаете кодировку UTF-8 в заголовке, этого может быть недостаточно. Я видел, как браузер игнорировал это раньше. Попробуйте заставить это, добавив это в начало своего html:

 <meta charset='utf-8'> 

Далее, как упоминалось здесь , попробуйте сделать следующее:

 mysql_query ("set character_set_client='utf8'"); mysql_query ("set character_set_results='utf8'"); mysql_query ("set collation_connection='utf8_general_ci'"); 

РЕДАКТИРОВАТЬ

Поэтому я только немного поработал над игрой. Сначала позвольте мне сказать вам, несмотря на то, что я упомянул в комментариях, utf8_encode() и utf8_decode() не помогут вам здесь. Это помогает понять кодировку UTF-8. Я нашел страницу Википедии на UTF-8 очень полезной. Предполагая, что значение, которое вы возвращаете из базы данных, на самом деле уже закодировано в кодировке UTF-8, и вы просто выгружаете его сразу после его получения, тогда все должно быть хорошо.

Если вы делаете что-либо с результатом базы данных (особенно с помощью манипуляции с строкой), и вы не используете функции поддержки unicode из библиотеки PHP mbstring, то это, вероятно, испортит ее, поскольку стандартные строковые функции PHP не являются unicode ,

Как только вы поймете, как работает кодировка UTF-8, вы можете сделать что-то классное:

 $test = "™"; for($i = 0; $i < strlen($test); $i++) { echo sprintf("%b ", ord($test[$i])); } 

Что сбрасывает что-то вроде этого:

 11100010 10000100 10100010 

Это правильно кодированный символ UTF-8 '™'. Если у вас нет такого символа в ваших данных, полученных из базы данных, тогда что-то перепутано.

Чтобы проверить, попробуйте найти специальный символ, который, как вы знаете, находится в результате с помощью mb_strpos() :

 var_dump(mb_strpos($db_result, '™')); 

Если это возвращает что-либо иное, кроме false то данные из базы данных прекрасны, иначе мы можем хотя бы установить, что это проблема между PHP и базой данных.

сначала необходимо выполнить следующий запрос.

 mysql_query("SET NAMES utf8");