2013-04-09 2 views
6

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

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

+2

Не относящийся к самому вопросу, но используйте 'mysqli' или PDO, а не расширение' mysql', которое устарело. – 2013-04-09 03:10:02

+0

Вы уверены, что все, что находится в вашей базе данных, является utf8? –

+0

[Обращение с Unicode Front To Back в веб-приложении] (http://kunststube.net/frontback/) – deceze

ответ

6

Ниже приводится код для меня.

$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']; 
} 
+0

arg! "Mysql_set_charset (" UTF-8 ");" DID устранить проблему. Просто не используйте htmlentities(). Я не понимал, что htmlentities() ТАКЖЕ требует указать кодировку, как описано здесь: http://stackoverflow.com/questions/9103801/htmlentities-converts-trademark-into-acirccent –

0

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

<meta charset='utf-8'> 

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

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

EDIT

Так что я только что сделал некоторые читают немного поиграть. Прежде всего позвольте мне сказать вам, несмотря на то, что я упомянул в комментариях, 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 и базой данных.

+0

После добавления изменений не было. После добавления другого материала проблема, похоже, ухудшилась. Вместо « » для ™ я получил «â ¢». –

+0

Чтобы убедиться, что кодировка символов на странице установлена ​​правильно, если вы используете firefox, вы бегали правой кнопкой мыши на странице и переходите к «Просмотр информации о странице», где она показывает кодировку. Показывает ли он «UTF-8» или что-то вроде «ISO-8859-1»? –

+0

Я не эксперт в кодировке символов, но раньше я работал. Я не знаю, поможет ли это, но вы должны, вероятно, проверить некоторые связанные с Unicode PHP-функции, такие как [utf8_decode] (http://php.net/manual/en/function.utf8-decode.php) и [mbstring] (http://php.net/manual/en/book.mbstring.php). –

-2

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

mysql_query("SET NAMES utf8"); 
+0

Пожалуйста, не используйте это, он может создавать проблемы с SQL-инъекциями при определенных обстоятельствах. Используйте «официальный» 'mysql_set_charset' API, который OP уже делает. – deceze

+0

Но я думаю, что [этот вопрос/ответ] (http://stackoverflow.com/a/7073506) говорит прямо противоположное? –

Смежные вопросы