У меня есть таблица, которая включает специальные символы, такие как ™.
Этот символ можно вводить и просматривать с помощью 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");